gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:23:23 25 4
gpt4 key购买 nike

我知道使用&符号地址来存储值的地址,但是当我要进行“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com