如何安全地将新的键值对添加到 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?
没有。您需要适当的同步。
我想从并发线程向 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?
没有。您需要适当的同步。