【问题标题】:Tour of Go, difference between & and no & when referring to a Vector struct围棋之旅,引用 Vector 结构时 & 和 no & 之间的区别
【发布时间】:2020-03-16 08:30:28
【问题描述】:

我知道使用 & 符号寻址存储值的地址,但是当我进入“Tour of Go”时,在他们介绍指针和特殊接收器的部分中,他们有如下代码来引用向量struct 进行缩放并获取绝对值,如图所示:

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs())
    v.Scale(5)
    fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs())
}

输出为:

Before scaling: &{X:3 Y:4}, Abs: 5
After scaling: &{X:15 Y:20}, Abs: 25

但是,如果我将主函数调用更改为 v := Vector{3.4} 而不是 v:= &Vector{3.4},我会得到相同的输出。在这种情况下引用内存地址是否更好?更多的是我似乎不理解的概念性情况。

【问题讨论】:

标签: pointers go struct pass-by-reference


【解决方案1】:

您不会得到完全相同的输出,请注意输出不再表明您已经传递了一个指针(缺少&):

Before scaling: {X:3 Y:4}, Abs: 5
After scaling: {X:15 Y:20}, Abs: 25

您仍然可以调用绝对值方法的原因是,当 Go 看到该方法存在于指针类型上但您直接使用该结构时,它会隐式为您获取 v 的地址,因为它总是可能的获取结构的地址并在指针接收器上派生方法调用。

有关详细信息,请参阅 Go 规范的“方法表达式”部分:https://golang.org/ref/spec#Method_expressions

在这个特定实例中并没有足够的信息来告诉您使用结构值或总是传递指针是好还是坏的做法。这在很大程度上取决于情况、结构的大小、是否要分配值堆栈或堆以及任何数量的其他因素。然而,对于大多数程序来说,它可能不会有什么不同,我建议你在学习 Go 的早期不必担心。

【讨论】:

  • 好的,谢谢你的解释,真的帮了大忙。
  • 很高兴能为您服务!如果这确实回答了您的问题,请务必点击大绿色复选标记将其标记为答案,并帮助其他任何人在未来搜索此问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多