使用sync.Map.Range()统计元素时VSCode提示copylock问题
问题解决:sync.Map传参引发的copylock警告
错误原因
sync.Map内部封装了sync.Mutex这类同步原语,而所有sync包下的锁类型都禁止值拷贝。当你把sync.Map作为值参数传入函数时,Go会对整个Map做值拷贝,包括内部的锁实例。拷贝后的锁和原锁完全独立,会破坏原Map的并发安全机制,引发数据竞争或不可预期的行为,因此静态分析工具会抛出copylocks警告。
修正代码
将函数参数改为指针类型,避免拷贝整个sync.Map:
func SyncMapSize(data *sync.Map) (count int) { data.Range(func(key, value interface{}) bool { count++ return true }) return count }
补充说明
所有sync包中的同步类型(如sync.Mutex、sync.RWMutex)都必须通过指针传递或作为结构体指针字段使用,绝不能做值拷贝,否则会彻底失效同步保护逻辑。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

