这个Go代码如何通过指针设置对象的值,而不解除引用?

Chl*_*loe 2 pointers go

我正在学习Java/Python背景,并且对Go教程中的代码感到困惑.在下面的代码中,该行

p.X = 1e9
Run Code Online (Sandbox Code Playgroud)

使用指针p将vX的值设置为1e9.由于p只是指向v的指针,因此不需要解除引用来设置v的值吗?因此,正确的陈述是:

*p.X = 1e9 
Run Code Online (Sandbox Code Playgroud)

当然,这会导致错误.有人可以解释为什么Go示例代码可以正常工作吗?

有问题的代码:

package main

import (
    "fmt"
)

type Vertex struct {
    X int
    Y int
}

func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*rdt 5

在go中,编译器自动将表达式转换为(*p).X.从语言规范:

如果x的类型是命名指针类型而且(*x).f是表示字段(但不是方法)的有效选择器表达式,则xf是(*x).f的简写.