我正在执行一个嵌套的sync.Map,但我想知道如果LoadOrStore返回的值与映射的输入相同,我是否可以保存几行代码,我的意思是:
var mapa sync.Map
mapaInterFace, ok := sessiones.LoadOrStore(userID,mapa)
if ok {
mapa,ok=mapaInterFace.(sync.Map)
if !ok{
return errors.New("type assertion")
}
}如果mapa与存储值时LoadOrStore返回的值相同,我可以立即使用它,但如果不是,则必须在前面的代码之后添加类型断言:
mapa,ok=mapaInterFace.(sync.Map)
if !ok{
return errors.New("type assertion")
}而且经常这样做会产生一些丑陋的代码。
更新:sessiones是sync.Map类型
发布于 2018-06-27 20:09:50
正如我稍后解释的,您应该为sync.Map类型使用指针。因此,我们可以简化为:
var mapa, mapb = new(sync.Map), new(sync.Map)
var key string
if actual, loaded := mapa.LoadOrStore(key, mapb); loaded {
if maps, ok := actual.(*sync.Map); ok {
mapb = maps
} else {
// handle loaded value type assertion error
}
}现在赋值很便宜,因为我们分配指针(*sync.Map)而不是结构(sync.Map)。
包同步 导入“同步” 类型图 Map类似于Go映射接口{}接口{},但是对于多个goroutines并发使用是安全的,而不需要额外的锁定或协调。加载、存储和删除在摊销的恒定时间内运行。 Map类型是专门化的。大多数代码应该使用普通的Go映射,使用单独的锁定或协调,以获得更好的类型安全性,并使维护其他不变量和映射内容变得更容易。 Map类型是针对两种常见的用例进行优化的:(1)当给定键的条目只写一次但多次读取时,就像在只增长的缓存中那样,或者(2)当多个goroutines对不相交的键集进行读、写和覆盖条目时。在这两种情况下,与单独的Mutex或RWMutex配对的Go映射相比,使用Map可以显著减少锁争用。 零映射是空的,可以使用。地图不得在第一次使用后复制。 类型Map struct { //包含筛选或未导出字段} (地图) LoadOrStore func (m *Map) LoadOrStore(键,值接口{})(实际接口{},加载的bool) 如果存在,LoadOrStore返回键的现有值。否则,它存储并返回给定的值。如果加载了值,则加载结果为true,如果存储,则为false。
第一次使用后不得复制
sync.Map。
在Go中,所有参数和接收者都通过值传递,就像通过赋值(副本)传递一样。例如,go vet报告一个sync.Map复制错误,
// go vet: variable declaration copies lock value to arg: sync.Map contains sync.Mutex
var m sync.Map
var arg interface{} = m和
var map1, map2 sync.Map
// go vet: call of map1.LoadOrStore copies lock value: sync.Map contains sync.Mutex
map1.LoadOrStore("key", map2)使用指针。例如,
var m sync.Map
var arg interface{} = &m和
var map1, map2 sync.Map
map1.LoadOrStore("key", &map2)https://stackoverflow.com/questions/51069683
复制相似问题