Son*_*nia 93
多个读者,没有作家是好的:
https://groups.google.com/d/msg/golang-nuts/HpLWnGTp-n8/hyUYmnWJqiQJ
一位作家,没有读者可以.(否则地图不会太好.)
否则,如果至少有一个编写器和至少一个编写器或读者,则所有读者和编写者必须使用同步来访问该映射.互斥锁可以正常工作.
小智 47
sync.Map 已于2017年4月27日合并为Go大师.
这是我们一直在等待的并发Map.
https://github.com/golang/go/blob/master/src/sync/map.go
小智 21
几天前我在这个 reddit线程中回答了你的问题:
在Go中,映射不是线程安全的.此外,例如,如果可能存在写入相同数据的另一个goroutine(同时,即),则数据甚至需要锁定.
从你在评论中的澄清来看,也会有一些setter函数,你的问题的答案是肯定的,你必须用互斥体保护你的读取; 你可以使用RWMutex.例如,您可以查看我编写的表数据结构(使用幕后地图)的实现源(实际上是在reddit线程中链接的那个).
orc*_*man 17
您可以使用concurrent-map来为您处理并发问题.
// Create a new map.
map := cmap.NewConcurrentMap()
// Add item to map, adds "bar" under key "foo"
map.Add("foo", "bar")
// Retrieve item from map.
tmp, ok := map.Get("foo")
// Checks if item exists
if ok == true {
// Map stores items as interface{}, hence we'll have to cast.
bar := tmp.(string)
}
// Removes item under key "foo"
map.Remove("foo")
Run Code Online (Sandbox Code Playgroud)