我是 Golang 世界的新手。我试图理解自动引用的概念。我对以下程序的困惑?第一个和第二个有什么区别函数 main 的第一行age(20).print()二三线myAge := age(20)myAge.print()完整程序如下:package mainimport "fmt"type age uint8func (a *age) print() { fmt.Println(a)}func main() { age(20).print() // this line throws error // however, the below line works properly myAge := age(20) myAge.print()}请帮助理解这两种方法之间的区别。我假设他们都是一样的。
1 回答
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
这是编译器提供的便利。如规范的调用部分所述:
如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写
这在 Effective Go 的方法指针与值部分中详细说明。
要确定什么是可寻址的,您可以参考规范的地址运算符部分。具体来说:
... 变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。
回到你的例子,(a *age) print()
是一个指针接收器age
。这意味着对age
变量的完整调用是&<expr>.print()
. 这只有在expr
可寻址的情况下才能完成。查看可寻址性要求:
myAge
是一个变量,它是可寻址的。age(20)
是类型转换,不可寻址。
忽略方法调用,您可以通过尝试以下操作轻松检查可寻址性:
_ = &age(20) // cannot take the address of age(20) myAge := age(20) _ = &myAge // works fine
- 1 回答
- 0 关注
- 123 浏览
添加回答
举报
0/150
提交
取消