这可能是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选择器
这是语言规范所允许的,选择器:
对于类型为
T
或*T
的x
其中T不是指针或接口类型,x.f
表示T
中存在f的最浅深度的字段或方法。[…][…]
[…,如果
x
的类型是已定义的指针类型,(*x).f
的类型是a表示字段(但不是方法)的有效选择器表达式,x.f
是(*x).f
.
在你的例子中,ptr
是一个定义的指针类型*cc
,(*cc).f
是一个基于规则1的有效选择器,因此规则3适用。