猿问

Golang指针

我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C ++现在很遥远...)。例如,在“第52号巡回赛”(http://tour.golang.org/#52)中,我读到:


type Vertex struct {

    X, Y float64

}


func (v *Vertex) Abs() float64 {

    return math.Sqrt(v.X*v.X + v.Y*v.Y)

}


func main() {

    v := &Vertex{3, 4}

    fmt.Println(v.Abs())

}

但是如果不是


func (v *Vertex) Abs() float64 {

[...]

v := &Vertex{3, 4}

我写:


func (v Vertex) Abs() float64 {

[...]

v := Vertex{3, 4}

甚至:


func (v Vertex) Abs() float64 {

[...]

v := &Vertex{3, 4}

反之亦然:


func (v *Vertex) Abs() float64 {

[...]

v := Vertex{3, 4}

我得到了完全相同的结果。有区别吗(在内存方面,等等)?


慕村9548890
浏览 185回答 3
3回答

Cats萌萌

有区别。例如,非指针接收器形式强制该方法在副本上工作。这样,该方法将无法更改对其调用的实例-它只能访问该副本。在时间/内存性能/消耗等方面可能无效。OTOH,指向实例的指针以及带有指针接收器的方法允许在需要的地方轻松进行实例共享(和变异)。

慕雪6442864

区别在于通过引用与通过值。在func f(v Vertex)参数中将其复制到parameter中v。在func f(v *Vertex)指向现有Vertex实例的指针中传递。使用方法时,可以为您完成一些解引用,因此您可以拥有一个方法func (v *Vertex) f()并调用它,而无需先获取指针:v := Vertex{...}; v.f()。这只是语法糖,AFAIK。
随时随地看视频慕课网APP

相关分类

Go
我要回答