go vet 报错:xx_xx passes lock by value: sync.Map contains sync.Mutex; call of xx_xx copies lock value

问题描述:

test.go:

package main  
import "fmt"
import "sync"

var syncMapTest sync.Map

func getSyncMapLen(smap sync.Map) int {
    count := 0
    smap.Range(func(key, value interface{}) bool {
            count++
            return true
    })
    return count
}

func main() {
   syncMapTest.Store(1, 2)
   if getSyncMapLen(syncMapTest) != 0 {
        fmt.Printf("len :%d \n",  getSyncMapLen(syncMapTest))
   } else {
         fmt.Printf("len 0 \n")
   }
}

:go vet 检查报错:
go vet test.go
#command-line-arguments
./test.go:7:25: getSyncMapLen passes lock by value: sync.Map contains sync.Mutex
./test.go:18:21: call of getSyncMapLen copies lock value: sync.Map contains sync.Mutex
./test.go:19:49: call of getSyncMapLen copies lock value: sync.Map contains sync.Mutex

原因分析:

go vet 工具会检测拥有 Lock 方法 (实际需要引用传递) 的 type 是否按值传递。如果是这种情况,则会发出警告。


解决方案:

把函数getSyncMapLen参数改成引用传递

test.go:

package main  
import "fmt"
import "sync"

var syncMapTest sync.Map

func getSyncMapLen(smap *sync.Map) int {
    count := 0
    smap.Range(func(key, value interface{}) bool {
            count++
            return true
    })
    return count
}

func main() {
   syncMapTest.Store(1, 2)
   if getSyncMapLen(&syncMapTest) != 0 {
        fmt.Printf("len :%d \n",  getSyncMapLen(&syncMapTest))
   } else {
         fmt.Printf("len 0 \n")
   }
}

参考:https://studygolang.com/articles/14479?fr=sidebar

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值