指针是否在方法内部默认取消引用?

我对 Go 中结构的方法感到困惑。我在他们有的教程中跟随:


func (p *Page) save() error {

    filename := p.Title + ".txt"

    return ioutil.WriteFile(filename, p.Body, 0600)

}

根据我的理解,p是指针,您需要在检索属性之前取消引用指针,例如:


filename := (*p).Title + ".txt"

这对我来说有意义的唯一方法是如果点->在 C++ 中表现得像。我错过了什么?


BIG阳
浏览 145回答 2
2回答

眼眸繁星

是的,指向结构的指针会自动取消引用。从关于选择器的规范:以下规则适用于选择器:对于xtypeT或*TwhereT不是指针或接口类型的值,x.f表示最浅深度的字段或方法,T 其中存在此类f。如果不完全是f最浅深度的,则选择器表达式是非法的。...作为一个例外,如果 的类型x是命名指针类型并且(*x).f是表示字段(但不是方法)的有效选择器表达式,x.f则是(*x).f.因此,以下两个语句是相同的(首选第一个):filename := p.Title + ".txt" filename := (*p).Title + ".txt"

忽然笑

您不必遵循指针或使用特殊的访问运算符来访问 Go 中结构的字段。myRef := &ILikeCompositeLiteralInitilization{}fmt.Println(myRef.Dereferenced);在功能上等同于;fmt.Printn((*myRef).Dereferenced);可能值得注意的是,函数的行为不是这样的。意思是,我必须取消引用才能调用接收类型是值而不是指针的方法。IE;func (*ILikeCompositeLiteralInitilization) PointerVersion()func (ILikeCompositeLiteralInitilization) ValueVersion()myRef.PointerVersion() // compiler likes thismyRef.ValueVersion() // won't compile(*myRef).ValueVersion() // compiler is OK with this基本上,使用函数不会发生隐式解引用或类型操作的地址,您的代码将无法编译。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go