我正在尝试计算sync.Map中的条目数,我创建了一个函数
func SyncMapSize(data sync.Map) (count int) {
data.Range(func(key, value interface{}) bool {
count++
return true
})
return count
}
但是,vscode 会提示我
SyncMapSize passes lock by value: sync.Map contains sync.Mutex
,还有一个关于 copylock 的链接:https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/copylocks
但是此链接已损坏,我不明白这里的问题。
有人知道吗?
问题实际上很简单,
sync.Map
包含一个sync.Mutex作为成员变量,按值复制互斥体在Go中是一种不好的做法,会导致各种数据争用和损坏。要修复此问题,只需更改方法签名以通过引用获取 sync.Map
func SyncMapSize(data *sync.Map) (count int) {
data.Range(func(key, value interface{}) bool {
count++
return true
})
return count
}