点操作符如何工作在结构体vs指针结构体?



这可能是Go的基础。点.操作符如何工作在结构体vs指针结构体?

type cc struct {
x int
}
func main() {
obj := cc{x:2}
ptr := &cc{x:3}

fmt.Printf("Hello, %vn", obj.x) // Hello, 2
fmt.Printf("Hello, %vn", ptr.x) // Hello, 3
}

如何能够在上述两种情况下访问字段?

编译器自动为指针接收者添加必要的间接。因此,ptr.x等于(*ptr).x

https://golang.org/ref/spec选择器

这是语言规范所允许的,选择器:

  1. 对于类型为T*Tx其中T不是指针或接口类型,x.f表示T中存在f的最浅深度的字段或方法。[…]

  2. […]

  3. […,如果x的类型是已定义的指针类型,(*x).f的类型是a表示字段(但不是方法)的有效选择器表达式,x.f(*x).f.

在你的例子中,ptr是一个定义的指针类型*cc,(*cc).f是一个基于规则1的有效选择器,因此规则3适用。