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

我知道使用&符号地址来存储值的地址,但是当我要进行“ 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,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},则会得到相同的输出。在这种情况下,参考内存地址是否是更好的做法?我似乎不了解更多的概念性情况。

WAGXZ 回答:围棋之旅,引用Vector结构时&与no与之间的区别

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

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

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

本文链接:https://www.f2er.com/3064699.html

大家都在问