猿问

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

我是 Golang 世界的新手。我试图理解自动引用的概念。


我对以下程序的困惑?第一个和第二个有什么区别


函数 main 的第一行

age(20).print()

二三线

myAge := age(20)

myAge.print()

完整程序如下:


package main

import "fmt"


type age uint8


func (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()

}

请帮助理解这两种方法之间的区别。我假设他们都是一样的。


慕码人8056858
浏览 124回答 1
1回答

拉莫斯之舞

这是编译器提供的便利。如规范的调用部分所述:如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写这在 Effective Go 的方法指针与值部分中详细说明。要确定什么是可寻址的,您可以参考规范的地址运算符部分。具体来说:... 变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。回到你的例子,(a *age) print()是一个指针接收器age。这意味着对age变量的完整调用是&<expr>.print().&nbsp;这只有在expr可寻址的情况下才能完成。查看可寻址性要求:myAge是一个变量,它是可寻址的。age(20)是类型转换,不可寻址。忽略方法调用,您可以通过尝试以下操作轻松检查可寻址性:_&nbsp;=&nbsp;&age(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;cannot&nbsp;take&nbsp;the&nbsp;address&nbsp;of&nbsp;age(20) myAge&nbsp;:=&nbsp;age(20) _&nbsp;=&nbsp;&myAge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;works&nbsp;fine
随时随地看视频慕课网APP

相关分类

Go
我要回答