2015-06-11 12 views
7

我對結構上的golang方法感到困惑。我在一個教程下面沿着他們有:指針在golang結構體方法中被默認取消引用了嗎?

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

從我的理解p是指針,你需要取消引用指針檢索的屬性,例如前:

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

唯一這對我來說是有道理的,如果點在C++中的行爲如->。我錯過了什麼?

+0

我不確定你爲什麼被低估,接受我的贊成。 – getWeberForStackExchange

回答

15

是的,指向結構的指針會自動解除引用。從spec on selectors

以下規則適用於選擇器:

  1. 對於T型或*T的值x其中T不是指針或接口類型,x.f表示在該字段或方法最深處T 哪裏有這樣的f。如果沒有一個f和 最淺的深度,則選擇器表達式是非法的。

...

  • 作爲例外,如果x類型是命名指針類型和(*x).f是一個有效的選擇器表達式表示一個場(但不是 方法),x.f(*x).f的簡寫。
  • 因此,下面的兩個語句是相同的(第一個是優選的):

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

    好吧,很高興知道!我會盡我所能接受。 – m0meni

    1

    您不必尊重指針或使用特殊的接入運營商進入的領域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 
    

    基本上,使用函數不會產生隱式的取消引用或類型操作的地址,您的代碼將不會編譯。