为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2021-10-18 09:51:13
我对 Go 中结构的方法感到困惑。我在他们有的教程中跟随:func (p *Page) save() error {    filename := p.Title + ".txt"    return ioutil.WriteFile(filename, p.Body, 0600)}根据我的理解,p是指针,您需要在检索属性之前取消引用指针,例如:filename := (*p).Title + ".txt"这对我来说有意义的唯一方法是如果点->在 C++ 中表现得像。我错过了什么?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

是的,指向结构的指针会自动取消引用。从关于选择器的规范:

以下规则适用于选择器:

  1. 对于xtypeT*TwhereT不是指针或接口类型的值,x.f表示最浅深度的字段或方法,T 其中存在此类f。如果不完全是f最浅深度的,则选择器表达式是非法的。

...

  1. 作为一个例外,如果 的类型x是命名指针类型并且(*x).f是表示字段(但不是方法)的有效选择器表达式,x.f则是(*x).f.

因此,以下两个语句是相同的(首选第一个):

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


查看完整回答
反对 回复 2021-10-18
?
忽然笑

TA贡献1806条经验 获得超5个赞

您不必遵循指针或使用特殊的访问运算符来访问 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

基本上,使用函数不会发生隐式解引用或类型操作的地址,您的代码将无法编译。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信