考虑下面的简单程序,我们在指向结构的指针上定义一个方法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以采用 aVertex而不是指针,那么无论传递的是指针还是结构体,突变都会失败。
这种行为似乎意味着参数v或指向v传递的指针完全取决于方法的定义,而不是实际传递的内容。
这是一个正确的解释吗,情况总是这样吗?如果不是,对这种行为的正确解释是什么?
相关分类