首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套映射的情况下,map.LoadOrStore返回的adress值是否与输入相同?

在嵌套映射的情况下,map.LoadOrStore返回的adress值是否与输入相同?
EN

Stack Overflow用户
提问于 2018-06-27 18:55:39
回答 1查看 1.2K关注 0票数 1

我正在执行一个嵌套的sync.Map,但我想知道如果LoadOrStore返回的值与映射的输入相同,我是否可以保存几行代码,我的意思是:

代码语言:javascript
复制
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返回的值相同,我可以立即使用它,但如果不是,则必须在前面的代码之后添加类型断言:

代码语言:javascript
复制
mapa,ok=mapaInterFace.(sync.Map)
    if !ok{
        return errors.New("type assertion")
    }

而且经常这样做会产生一些丑陋的代码。

更新:sessiones是sync.Map类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 20:09:50

正如我稍后解释的,您应该为sync.Map类型使用指针。因此,我们可以简化为:

代码语言:javascript
复制
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复制错误,

代码语言:javascript
复制
// go vet: variable declaration copies lock value to arg: sync.Map contains sync.Mutex
var m sync.Map
var arg interface{} = m

代码语言:javascript
复制
var map1, map2 sync.Map
// go vet: call of map1.LoadOrStore copies lock value: sync.Map contains sync.Mutex
map1.LoadOrStore("key", map2)

使用指针。例如,

代码语言:javascript
复制
    var m sync.Map
    var arg interface{} = &m

代码语言:javascript
复制
    var map1, map2 sync.Map
    map1.LoadOrStore("key", &map2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51069683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档