go 不可寻址的理解
The concrete value stored in an interface is not addressable, in the same way that a map element is not addressable.
意思具体值赋值给 interface 类型后与 map 中的元素一样是不可寻址的。
map 由于可能触发扩容,元素不可寻址;
package main
const NewName = "run.wu"
type Person interface {
getName() string
setName(name string)
}
type Male struct {
Name string
}
func (m Male) getName() string {
return m.Name
}
func (m *Male) setName(name string) {
m.Name = name
}
func main() {
var p1 Person = Male{} // error
p1.getName()
p1.setName(NewName)
var p2 Person = &Male{}
p2.getName()
p2.setName(NewName)
}
初始化 Male 的值对象赋值给 Person 接口,记作 p1,直接报错:
cannot use Male literal (type Male) as type Person in assignment:
Male does not implement Person (setName method has pointer receiver)
错误内容是,Male 类型的变量不能赋值给 Person,因为 Male 类型没有实现 Person 接口(setName 是指针接收者方法)。
那为什么之前的例子中,编译器可以自动将值类型(非接口类型)取地址做隐示转换,而这里就不可以了?原因就是开头那就话:
The concrete value stored in an interface is not addressable.
值类型赋值给接口,是不可寻址的,既然不可寻址,编译器也就没办法自动取其地址传给指针接收的方法了。