【问题标题】:Why user pointers to structs in golang? [duplicate]为什么用户指针指向 golang 中的结构? [复制]
【发布时间】:2020-11-16 09:21:58
【问题描述】:

来自 go 教程中的教程 -

package main

import "fmt"

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
}

我可以只做 v.X 来获得相同的值,而不是分配一个指针(p = &v 然后 p.X)。 是否有类似的设计模式稍后会出现?

【问题讨论】:

  • 我这个question 解释你的问题或至少一个非常相似的问题。
  • 参加完整的围棋之旅。指针真的很简单,没有什么可担心的,大多数时候它并不重要,重要的是它是显而易见的。
  • 感谢@Volker,我刚开始使用它,它与我习惯的动态类型语言 JS 完全不同。

标签: go


【解决方案1】:

是的,你可以做到v.X = 1e9。这就是示例的重点,v.X = 1e9p := &v; p.X = 1e9 是等价的。这是一个简单的例子来说明指针是如何工作的。这并不意味着实用。

一旦你开始将结构传递给方法,指针就变得非常重要。假设您想编写一个设置 X 的方法。如果我们将结构作为值传递...

func (v Vertex) setX(newX int) {
    v.X = newX
}

func main() {
    v := Vertex{1, 2}
    v.setX(1e9)
    fmt.Println(v)
}

我们得到{1 2}。它没有设置。这是因为 Go 复制 值到方法中。 setX 在你的结构副本上工作。

相反,我们传递一个指针。

func (v *Vertex) setX(newX int) {
    v.X = newX
}

现在我们得到{1000000000 2}setX 正在处理指向您的结构的指针。

注意 v.setX(1e9) 确实是 (&v).setX(1e9) 但 Go 会为你翻译。

方法并不是唯一有用的地方指针。如果您想在多个位置处理相同的数据,请使用指针。

参见Methods: Pointers vs ValuesA Tour Of Go: Methods

【讨论】:

  • 谢谢@Schwenn!我很快就会在巡回赛中接触到方法,然后我认为这一切对我来说都会开始变得更有意义。在 JS 中,我将定义一个对象并开始传递该对象的副本以实现不变性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多