【发布时间】:2020-04-20 12:34:23
【问题描述】:
刚接触 Golang 并试图理解我遇到的代码 sn-p。在我正在阅读的博客中,他们定义了一个 Vertex 结构,如下所示:
type Vertex struct {
X int
Y int
}
然后展示如何创建它的新实例并修改其字段之一的示例:
v1 := Vertex{1,2}
v1.X = 3
但是,他们展示了一个示例,说明如何创建指向此结构实例的 指针 并修改其中一个字段:
v2 := &Vertex{3,4}
v2.X = 3
这让我有点困惑。对我来说,v2 := &Vertex{3,4} 语句转换为:“v2 是指向新 Vertex{3,4} 实例的指针”。如果这是真的,那么如果v2 是一个指向Vertex 结构的指针,而不是Vertex 结构本身,那么我们如何在它上面调用v2.X(它是一个指针! !!)?
【问题讨论】:
-
编译器(或者它是运行时?我忘了)自动取消引用指针。所以
v2.X变成了(*v2).X。 -
... 更多信息参见:golang.org/ref/spec#Selectors ... "作为一个例外,如果 x 的类型是定义的指针类型并且 (*x).f 是有效的表示字段(但不是方法)的选择器表达式,xf 是 (*x).f 的 简写。"
-
C 使用
->,但在 Go 中一个简单的.就足够了,因此不需要额外的符号。 -
我认为这个问题对 Go 新手来说很有价值。一个人在寻找这个问题的答案时进入“选择器”并不容易,因为人们主要会搜索类型提升或自动取消引用等概念。鉴于 Go 语言是如何记录的(几乎是使用的语法规则由编译器,即学习阅读和理解语言以外的另一件事),这并不是一个新的语言学习者感到困惑的事情。
标签: pointers go struct mutators