为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 自动引用,并不总是可以得到一个值的地址

Golang 自动引用,并不总是可以得到一个值的地址

Go
慕码人8056858 2022-06-13 15:36:45
我是 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


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信