登录
首页 >  Golang >  Go问答

Golang 自动引用并非总能取得地址值

来源:stackoverflow

时间:2024-02-21 18:39:25 251浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Golang 自动引用并非总能取得地址值》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我是 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()
}

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


解决方案


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

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

effective go 的 method Pointers vs Values 部分对此进行了详细阐述。

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

...变量、指针间接或切片索引 手术;或可寻址结构操作数的字段选择器;或一个 可寻址数组的数组索引操作。作为一个例外 可寻址性要求,x也可以是a(可能是 带括号)复合文字。

回到您的示例,(a *age) print()age 上的指针接收器。这意味着对 age 变量的完整调用是 &.print()。仅当 expr 可寻址时才能执行此操作。查看可寻址性要求:

  • myage 是一个变量,它是可寻址的。
  • age(20) 是类型转换,不可寻址。

忽略方法调用,您可以通过尝试以下操作轻松检查可寻址性:

_ = &age(20)     // cannot take the address of age(20)
myAge := age(20)
_ = &myAge       // works fine

理论要掌握,实操不能落!以上关于《Golang 自动引用并非总能取得地址值》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>