gpt4 book ai didi

go - 结构上方法的参数传递语义是否完全由方法而不是由调用者决定?

转载 作者:IT王子 更新时间:2023-10-29 01:39:31 29 4
gpt4 key购买 nike

考虑以下简单程序,我们在指向结构 Vertex 的指针上定义一个方法,然后用指针调用它。

package main

import (
"fmt"
)

type Vertex struct {
X, Y float64
}

func (v *Vertex) Mutate() {
v.X = 8
}

func main() {
v := &Vertex{3, 4}
v.Mutate()
fmt.Println(v.X)
}

这个程序的输出是 8,这是我们所期望的,因为我们将一个指针传递给一个接受指针的方法。

但是,以下调用的输出也是 8。

func main() {
v := Vertex{3, 4}
v.Mutate()
fmt.Println(v.X)
}

对称地,如果我们重新定义方法 Mutate 以获取 Vertex 而不是指针,那么无论传递的是指针还是结构,突变都会失败。

这种行为似乎暗示是否要传递参数 v 或指向 v 的指针完全取决于方法的定义,而不是实际正在传递的内容通过。

这是一个正确的解释吗?这种情况会一直存在吗?如果不是,对此行为的正确解释是什么?

最佳答案

This behavior seems to imply that whether the argument v or a pointer to v to passed depends entirely on the definition of the method, rather than on what is actually being passed.

Is this a correct interpretation, and will this always be the case? If not, what is the correct explanation for this behavior?

不,这是不正确的,但几乎是正确的。

传递给您的方法的一个指针,即使它看起来像v.Mutate() with v 是一个非指针.原因是:您的 v 是“可寻址的”,因此它的方法集包括指针类型的方法。参见 http://golang.org/ref/spec#Calls了解详情。这是一种语法糖。因为 v 是可寻址的,您可以使用它的地址 &v 并且在这个指针上您可以调用您的方法,例如 (&v).Mutate。这种语法很笨拙,Go 会自动为您完成可寻址表达式。

(如果你对这些东西感兴趣,为什么不阅读整个语言规范?它可以在 3 小时内完成。)

关于go - 结构上方法的参数传递语义是否完全由方法而不是由调用者决定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149191/

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