如何在具有类型接口的情况下向syncmap.Map添加条目

时间:2017-09-27 01:52:20

标签: go interface

在这个例子中,我试图将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()
}

1 个答案:

答案 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现在是标准库的一部分。

工作示例:https://play.golang.org/p/ib-dfXjPDy