在 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]
- 1 回答
- 0 关注
- 153 浏览
添加回答
举报
0/150
提交
取消