【问题标题】:Modifying field values to struct pointers in Go [duplicate]在 Go 中将字段值修改为结构指针 [重复]
【发布时间】: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


【解决方案1】:

使用指针访问结构字段,您不需要显式取消引用。

这就是为什么v2.X(*v2).X 相同

了解更多详情here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多