【发布时间】:2019-11-04 07:07:18
【问题描述】:
围棋官方网站writes as follows:
正如 Go 规范所说,类型 T 的方法集包括 所有接收器类型为 T 的方法,而相应的接收器类型为 T 指针类型 *T 由所有带有接收者 *T 或 T 的方法组成。 表示 *T 的方法集包含 T 的方法集,但不包含相反的方法。
出现这种区别是因为如果接口值包含 指针 *T,方法调用可以通过解引用 指针,但如果接口值包含值 T,则不存在 方法调用获取指针的安全方法。 (这样做将允许 修改接口内值内容的方法, 这是语言规范所不允许的。)
即使编译器可以将值的地址 传递给方法,如果方法修改了值,更改将 迷失在调用者中。
我的问题是,当不能编译器将一个值传递给指针接收器值时?
【问题讨论】:
-
见stackoverflow.com/q/40828156/1256452:为什么接口不实现带有指针引用的方法,而直接访问仍然是可能的? - 这是否涵盖了您想知道的情况?
-
"什么时候编译器不能将值传递给指针接收器值?"正如从规范中引用的第二段中所解释的那样:总是。如果您对规范中标记为粗体的部分感兴趣:有些东西是不可寻址的,例如a function:不能取函数的地址。 (如果你是 Go 新手:这很无趣。)
标签: go