为了账号安全,请及时绑定邮箱和手机立即绑定

go map value 和 nil 的区别

go map value 和 nil 的区别

Go
泛舟湖上清波郎朗 2022-06-21 10:18:38
在 go 中,当 key 不存在时,map 的值是零值。我在下面有一个简短的代码片段: 操场package mainimport (    "sync")func main() {    var mm map[int]sync.Mutex    var m sync.Mutex    mm[1].Lock() // not work due to cannot call pointer method on mm[1] and cannot take the address of mm[1]    m.Lock() // work normal}mm[1]和上面有什么区别m?我用反射来检查,但看不出它们之间的区别。关于导致差异的任何线索?
查看完整描述

1 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

问题不在于地图的零值,而在于方法调用期间的可寻址性。

互斥锁上的Lock方法有一个指针接收器:

func (*Mutex) Lock

给定变量,根据规范m sync.Mutex调用带有指针接收器的方法将自动变为:&m.Lock()

如果 x 的(类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 xm() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写

其中重要的部分是可寻址的要求。该变量m是可寻址的,但映射查找的返回值不是。这意味着编译器不会尝试调用&mm[1].Lock().

这些可以在您尝试编译示例时返回的错误消息中看到:

./prog.go:11:7: cannot call pointer method on mm[1]
./prog.go:11:7: cannot take the address of mm[1]


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信