use*_*934 3 types pointers reference go
我是 Golang 世界的新手。我试图理解自动引用的概念。
我的困惑与以下程序有关?第一个和第二个有什么区别
age(20).print()
Run Code Online (Sandbox Code Playgroud)
myAge := age(20)
myAge.print()
Run Code Online (Sandbox Code Playgroud)
完整程序如下:
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()
}
Run Code Online (Sandbox Code Playgroud)
请帮助理解这两种方法之间的区别。我假设他们都是一样的。
这是编译器提供的便利。正如规范的调用部分所述:
如果 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |