Go 当接收器方法T不能接受*T时?

Go 当接收器方法T不能接受*T时?,go,Go,官方网站: 正如Go规范所说,类型T的方法集包括 所有方法均采用T型接收机,而相应的 指针类型*T包含所有带有接收器*T或T的方法 表示*T的方法集包括T的方法集,但不包括相反的方法集 出现这种区别是因为如果接口值包含 指针*T,方法调用可以通过解引用 指针,但如果接口值包含值T,则不存在 方法调用获取指针的安全方法。(这样做将允许 修改接口内值内容的方法, 这是语言规范不允许的。) 即使在编译器可以将值的地址 传递给方法,如果该方法修改了值,则将更改 在呼叫者中迷失 我的问题是,当编译器不能将

官方网站:

正如Go规范所说,类型T的方法集包括 所有方法均采用T型接收机,而相应的 指针类型*T包含所有带有接收器*T或T的方法 表示*T的方法集包括T的方法集,但不包括相反的方法集

出现这种区别是因为如果接口值包含 指针*T,方法调用可以通过解引用 指针,但如果接口值包含值T,则不存在 方法调用获取指针的安全方法。(这样做将允许 修改接口内值内容的方法, 这是语言规范不允许的。)

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


我的问题是,当编译器不能将值转换为指针接收器值时?

可寻址的定义如下:

对于类型为T的操作数x,地址操作&x生成一个类型为*T到x的指针。操作数必须是可寻址的,即变量、指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,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
}

请参阅:为什么接口在仍然可以直接访问的情况下不使用指针引用实现方法?-这是否涵盖了您想知道的情况?“编译器何时不能将一个值转换为指针接收器值?”如规范中引用的第二段所述:始终。如果您对规范中标记为粗体的部分感兴趣:有些东西是不可寻址的,例如函数:不可能获取函数的地址。(如果你是新手:这很没意思。)