如何安全地将新的键值对添加到 go native map 中

How to safely add new key-value pair into go native map

我想从并发线程向 Golang 映射添加一个新的键值对。问题是如果地图中存在密钥,我们不会创建新的对。从多线程的角度来看,如何检查当前条件,如果不存在键,则插入键值。

有什么方法可以组织代码以在第一次遇到时安全地添加密钥?

主要问题是安全初始化互斥量

我会推荐sync.Map to store the key-values and sync.Once值内部的组合来执行一次性初始化。

这是一个例子:

type Value struct {
    init       sync.Once
    someValue  string
}

func (v *Value) Init() {
    v.init.Do(func() {
        // This function will only be executed one time
        v.someValue = "initialized"
    })
}

func main() {
    var m sync.Map

    v1, _ := m.LoadOrStore("key", &Value{})
    v1.(*Value).Init() // init function is called

    v2, _ := m.LoadOrStore("key", &Value{})
    v2.(*Value).Init() // init function is not called
}

Is there any way to organize code to add key safely when first encountered?

没有。您需要适当的同步。