默认情况下,方法中的指针是否被取消引用?

时间:2015-06-11 16:19:51

标签: pointers go

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

func (p *Page) save() error {
    filename := p.Title + ".txt"
    return ioutil.WriteFile(filename, p.Body, 0600)
}

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

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

这对我有用的唯一方法是,如果点在C ++中的行为类似于->。我错过了什么?

2 个答案:

答案 0 :(得分:22)

是的,指向结构的指针会自动解除引用。来自spec on selectors

  

以下规则适用于选择器:

     
      
  1. 对于类型xT的值*TT不是指针或接口类型,x.f表示字段或方法T中最浅的深度   哪里有这样的f。如果没有一个f   最浅的深度,选择器表达式是非法的。
  2.         

    ...

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

因此,以下两个陈述是相同的(首先是首选):

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

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