2016-04-04 6 views
0

Ben varsa:Yapılarımdaki bir değişken neden değerini tutmuyor?

type Foo struct { 
    bar int 
} 

Ve Foo üzerinde tanımlı bir yöntemi (bunu fark * Foo, sadece Foo var):

func (self Foo)incrementBar() { 
    self.bar++ 
} 

Neden Foo yapma ve iki kez yöntemi çağrıldıktan sonra:

myFoo := Foo{} 
myFoo.incrementBar() 
myFoo.incrementBar() 

, myFoo her çağrıldığında artımBar yönteminin içinde hala 0 bar çubuğudur? Yani, her seferinde artışla 2'ye ulaşmaz, her seferinde artım değeri üzerinde bir ++ işlemi yapar.

+2

Yinelenen:

İşte konuyla ilgili iyi bir makale. Go Turu bütün bunları gayet iyi açıklıyor. Al onu. – Volker

cevap

5

Dahili değişkenleri değiştirdiğinizden, işaretçi yöntemini kullanmalısınız. incrementBar için işaretçi olmayan yöntem alıcı kullandığınızda, Foo örneği kopyalanır ve incrementBar'a geçirilir. incrementBar'da self değiştirmesi, yalnızca bir kopya olduğu için myFoo değerini değiştirmez. http://nathanleclaire.com/blog/2014/08/09/dont-get-bitten-by-pointer-vs-non-pointer-method-receivers-in-golang/

+0

Ama ya beni bir işaretçi yöntem alıcısı yapmak için zorlama bir inteface ise. Yapmam gereken arayüz benim yöntemimin Foo değil * Foo olmasını gerektirir. –

+0

@AndrewArrow arayüzü bunu zorlamaz. Eğer işaretçi alıcı olarak kullanırsanız, o zaman ** işaretçi ** arabirimi uygular. Yani "Foo {}" yerine "Foo {}" yerine geçecek) :) – nevets

+0

"GreenFoo, ColorFoo uygulamıyor (çubuk yöntemi, işaretçi alıcısıdır)" –