pointers - 围棋之旅,引用Vector结构时&与no与之间的区别

标签 pointers go struct pass-by-reference

我知道使用&符号地址来存储值的地址,但是当我要进行“Tour of Go”时,在介绍指针和特殊接收器的部分中,他们具有以下代码,用于按比例缩放Vector结构并获得如下所示的绝对值:

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

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

最佳答案

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

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

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

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

在此特定实例中,实际上没有足够的信息来告诉您使用struct值还是始终传递指针是好是坏做法。这很大程度上取决于情况,结构的大小,是否要分配值堆栈或堆以及其他许多因素。但是,对于大多数程序而言,它可能不会有所作为,我建议您在学习Go时就不必担心它。

关于pointers - 围棋之旅,引用Vector结构时&与no与之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957455/

相关文章:

c - 如何比较指针与ascii字符?

c++ - 将数组 (int*) 设置为 NULL 是否会释放它占用的内存?

struct - 如何使用从另一个包导入的结构

c++ - 在 C++ 中将结构保存到剪贴板

c# - 为什么在结构的构造函数中设置属性不起作用?

c - 未初始化 C Visual 中使用的指针变量

c - 从不兼容的指针类型传递参数 1( 'strcmp')

bash - 为 Go 编程语言设置 vim 自动完成

go - 关闭由 channel 链接的 goroutine 链的优雅方法是什么?

C:类型冲突错误