猿问

go map value 和 nil 的区别

在 go 中,当 key 不存在时,map 的值是零值。我在下面有一个简短的代码片段: 操场


package main


import (

    "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?我用反射来检查,但看不出它们之间的区别。关于导致差异的任何线索?


泛舟湖上清波郎朗
浏览 155回答 1
1回答

守候你守候我

问题不在于地图的零值,而在于方法调用期间的可寻址性。互斥锁上的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]
随时随地看视频慕课网APP

相关分类

Go
我要回答