2014-06-10 54 views
2

我有以下的結構和:golang方法指針到接收機

type Person struct { 
    Name string 
} 


steve := Person{Name: "Steve"} 

你能解釋一下以下2種方法(一個沒有指針和一個與接收機)兩如何能夠打印頁。名稱?

​​

豈不名稱不直指着的人(而不是實例史蒂夫?)

回答

4

都指向實例時每次調用該函數時存在,但是(p Person)指向一個新副本,其中(p *Person)將始終指向相同的實例。

檢查this例如:

func (p Person) Copy() { 
    p.Name = "Copy" 
} 

func (p *Person) Ptr() { 
    p.Name = "Ptr" 
} 

func main() { 
    p1, p2 := Person{"Steve"}, Person{"Mike"} 
    p1.Copy() 
    p2.Ptr() 
    fmt.Println("copy", p1.Name) 
    fmt.Println("ptr", p2.Name) 
} 

又看了Effective Go,這是一個很好的資源的語言。

+0

因此我假設如果方法改變了p.Name的值,那麼它會改變原來的'史蒂夫',但如果我改變了'(p Person)'版本中Name的值,我改變了將會是立即無法訪問,因爲我沒有處理副本? – lukemh

+0

正確,檢查更新的示例。 – OneOfOne

+0

就像說明一樣,按值調用方法時性能存在差異。根據結構的大小或調用方法的頻率,它可能也可能不重要,但是可以考慮:) – jocull