猿问

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

考虑下面的简单程序,我们在指向结构的指针上定义一个方法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传递的指针完全取决于方法的定义,而不是实际传递的内容。


这是一个正确的解释吗,情况总是这样吗?如果不是,对这种行为的正确解释是什么?


DIEA
浏览 145回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答