【问题标题】:Golang auto referencing, not always possible to get the address of a valueGolang 自动引用,并不总是可以得到一个值的地址
【发布时间】:2020-10-16 17:50:59
【问题描述】:

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

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

  1. main 函数的第一行
age(20).print()
  1. 二三线
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()
}

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

【问题讨论】:

    标签: pointers go types reference


    【解决方案1】:

    这是编译器提供的便利。如规范的calls 部分所述:

    如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是简写 对于 (&x).m()

    这在 Effective Go 的 method Pointers vs Values 部分有详细说明。

    要确定什么是可寻址的,您可以参考规范的Address operators 部分。具体来说:

    ... 变量、指针间接或切片索引 手术;或可寻址结构操作数的字段选择器;或一个 可寻址数组的数组索引操作。作为一个例外 可寻址性要求,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
    

    【讨论】:

    • 感谢@Marc。现场真的很有用。还要感谢您在 go docs 中为我指出正确的位置。
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多