用sync.Map.Range()统计结果,vscode提示copylock问题

问题描述 投票:0回答:1

我正在尝试计算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

但是此链接已损坏,我不明白这里的问题。

有人知道吗?

go
1个回答
0
投票

问题实际上很简单,

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
}
© www.soinside.com 2019 - 2024. All rights reserved.