在Go语言中为什么不需要使用指针符号(*)来改变struct的属性?[duplicate]

ogq8wdun  于 2023-02-17  发布在  Go
关注(0)|答案(2)|浏览(97)
    • 此问题在此处已有答案**:

When do Go's pointers dereference themselves(1个答案)
Rule for Go Pointers, References, Dereferencing:(1个答案)
Go: I get a struct field value without deferencing the pointer variable of the struct type, why?(1个答案)
5天前关闭。
我有点困惑,因为在下面的例子中,两个函数都可以改变Vertex的状态,但是Vertex v不应该只是函数ChangeX的内存地址吗?

package main

import (
    "fmt"
)

type Vertex struct {
    X, Y float64
}

func (v *Vertex) ChangeVertex() {
    *v = Vertex{3, 4}
}

func (v *Vertex) ChangeX() {
    v.X = 100
}

func main() {
    v := Vertex{4, 4}
    v.ChangeVertex()
    fmt.Println(v)
    v.ChangeX()
    fmt.Println(v)
}

如果v是其上下文中的内存地址,函数ChangeX如何改变v. X的值?

oug3syen

oug3syen1#

Go语言允许使用.通过指针访问字段,从而使代码更易于读写。
https://go.dev/tour/moretypes/4
当我们有结构体指针p时,要访问结构体的字段X,我们可以写(*p). X。然而,这种表示法很麻烦,所以语言允许我们只写p.X,而不显式地解引用。

5uzkadbs

5uzkadbs2#

由于v是指针,因此编译器将表达式v.x视为(*v).x的快捷方式
参见:https://go.dev/ref/spec#Selectors

相关问题