在这个例子中,我试图将1存储在名为value的syncmap中的密钥“xxxxxxx”上。值的类型是interface {}。所以,我有一个类型断言使它成为一个syncmap.Map,它是mm。然后,我将新条目添加到mm。不幸的是,新的条目,并没有增加价值,只有毫米。看起来mm是副本或其他东西。我不确定如何使这项工作。
具体来说,我想我需要做类型断言来添加条目。但是,我认为类型断言正在复制。您能否建议如何执行此操作,以便将条目(“xxxxxxx”,1)实际添加到名为值的同步映射中?
func Test(name string, m syncmap.Map) {
log.Print(name, " ")
m.Range(func(key, value interface{}) bool {
log.Println(">>", value)
mm := value.(syncmap.Map)
mm.Store("xxxxxxx", 1)
PrintMap(">>>>>>>>>>>>> " + key.(string), value.(syncmap.Map))
return true
})
log.Println()
}
答案 0 :(得分:1)
你认为内部地图是副本是正确的。要对地图进行持久更改,请使用指针。
func Test(name string, m *sync.Map) { // make parameter a pointer
log.Print(name, " ")
m.Range(func(key, value interface{}) bool {
mm, ok := value.(*sync.Map) // outer map must also store inner maps as pointers
mm.Store("xxxxxxx", 1)
return true
})
log.Println()
}
更新代码中声明主外部映射的部分,以存储指向sync.Map
类型的指针。例如:
var m sync.Map // outer map
m.Store("A", &sync.Map{})
m.Store("B", &sync.Map{})
m.Store("C", &sync.Map{})
a, _ := m.Load("A")
am, _ := a.(*sync.Map)
am.Store("xxxx", 1)
请注意,我使用了sync
个包而不是syncmap
,因为syncmap.Map
现在是标准库的一部分。