当接收方方法T不能取* T吗?

官方Go网站writes as follows

  

正如Go规范所述,类型T的方法集包括   接收器类型为T的所有方法,而对应类型的方法   指针类型* T包含接收者* T或T的所有方法。   表示* T的方法集包括T的方法集,但不包括反向的方法。

     

之所以会出现这种区别,是因为如果接口值包含一个   指针* T,方法调用可以通过取消引用来获取值   指针,但是如果接口值包含值T,则没有   方法调用获取指针的安​​全方法。 (这样做将允许   修改接口内部值内容的方法,   这是语言规范所不允许的。)

     

即使在编译器可以将值的地址   传递给该方法,如果该方法修改了值,则更改将   迷失在呼叫者中。

我的问题是,何时不能编译器将值赋给指针接收器值?

zc88888 回答:当接收方方法T不能取* T吗?

可寻址在https://golang.org/ref/spec#Address_operators中定义:

  

对于类型T的操作数x,地址操作&x生成指向* x的类型* T的指针。操作数必须是可寻址的,即变量,指针间接访问或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x可能是(可能带有括号的)复合文字。

一个计数器示例包括映射值和函数:

func f() {}

func main() {
    var m map[string]string
    p1 := &m["foo"] // cannot take the address of m["foo"]
    p2 := &f        // cannot take the address of f
}
本文链接:https://www.f2er.com/3168565.html

大家都在问