我对Go中结构的方法感到困惑。我一直在他们的教程中跟随:
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
根据我的理解,p
是指针,你需要在检索属性之前取消引用指针,例如:
filename := (*p).Title + ".txt"
这对我有用的唯一方法是,如果点在C ++中的行为类似于->
。我错过了什么?
答案 0 :(得分:22)
是的,指向结构的指针会自动解除引用。来自spec on selectors:
以下规则适用于选择器:
- 对于类型
醇>x
或T
的值*T
,T
不是指针或接口类型,x.f
表示字段或方法T
中最浅的深度 哪里有这样的f
。如果没有一个f
最浅的深度,选择器表达式是非法的。...
- 作为例外,如果
的简写 醇>x
的类型是命名指针类型,(*x).f
是表示字段的有效选择器表达式(但不是 方法),x.f
是(*x).f
。
因此,以下两个陈述是相同的(首先是首选):
filename := p.Title + ".txt"
filename := (*p).Title + ".txt"
答案 1 :(得分:1)
您不必使用deference指针或使用特殊的访问运算符来访问Go中结构的字段。
myRef := &ILikeCompositeLiteralInitilization{}
fmt.Println(myRef.Dereferenced);
在功能上等同于;
fmt.Printn((*myRef).Dereferenced);
可能值得注意的是,函数的行为不是这样的。意思是,我必须取消引用来调用一个接收类型的方法是值而不是指针。 IE;
func (*ILikeCompositeLiteralInitilization) PointerVersion()
func (ILikeCompositeLiteralInitilization) ValueVersion()
myRef.PointerVersion() // compiler likes this
myRef.ValueVersion() // won't compile
(*myRef).ValueVersion() // compiler is OK with this
基本上,对于函数,不会发生隐式解引用或类型操作的地址,您的代码将无法编译。