go 语言规范里定义的 method sets 规则
Values | 可调用的方法(methods receivers) | 备注 |
---|---|---|
T | (t T) funcXXX | 为什么不能调用 (t *T) funcXXX,因为无法保证所有的Value 都可以获取到指针地址(addressable value) |
*T | (t T) funcXXX and (t *T) funcXXX | go 自动转化(dereferenced) *T --> T, 所以可以调用 |
为什么有些值无法获取地址?
go spec: https://golang.org/ref/spec#Address_operators 说明了不能寻址的情况。
常见的不能寻址的情况:
&m["key"]
&afunc()
&t.method()
var x *int = nil
*x // causes a run-time panic
&*x // causes a run-time panic
// 如果用变量保存中间结果值,就可寻址
v := afunc()
&v
总结:本质原因语言特性所决定的,目前官方文档无较明确对该现象的定义;作为语言使用者,可以理解为go本身语言特性决定的问题,知道一些常见的反例,注意避开情况。
网友评论