2011-02-08 16 views
5

Etkili Git ve Git Öğreticilerini ve bazı kaynakları okudum, ancak interface {} sözdiziminin ardındaki tam mekanizma Go'nun bana biraz gizemli. İlk kez heap.Interface'u uygulamaya çalışırken gördüm ve bir türden bir kap olarak görünüyor (biraz monadını hatırlatıyor).Go'da "interface {}" sözdiziminin rolü nedir?

Neden bunu kullanmak için yazılır? Jenerikler için bir çeşit çözüm mü? heap.Interface'dan değerlerin heap.Pop(&h).(*Foo) (Foo yazmak için bir yığın işaretçisinin olması durumunda) olması gerekenden daha şık bir yol var mı?

cevap

7

interface{} her şeyi tutabilen genel bir kutu. Hareket halindeki ara yüzler bir dizi metodu tanımlar ve bu yöntemleri uygulayan herhangi bir tip arayüze uygundur. interface{} hiçbir yöntemi tanımlamaz ve tanımı gereği her bir tür bu arabirime uygundur ve bu nedenle interface{} türünde tutulabilir.

Gerçekten jenerikler gibi değil. Bunun yerine, tip sistemini rahatlatmanın ve "burada herhangi bir değerin buraya geçirilebileceğini" söylemenin bir yolu. Bu işlevsellik için C'deki eşdeğeri, Go içinde tutulan değerin türünü sorgulayabileceğiniz bir void * işaretçisidir.

+0

Ahh, bu anonim bir tip! Anladım. Teşekkür ederim! Tutulan türün sorgulanması için bir çeşit yansıma kullanacağımı düşünüyorum. O bölümle henüz çalışmadım; Şimdiye kadar değerleri geri almak için sadece (tek, bana) '. ()' sözdizimini kullandım. –

+0

Türü sorgulamanıza izin veren bir yansıtma paketi var veya normal bir anahtara benzeyen bir tip anahtarını kullanabilirsiniz, ancak durumlar türlerdir. Ya da yalnızca türden bir onaylamayan sürümü kullanabilirsiniz (ör. 'Value, ok: = foo. (Type)') –

1

İşte, kaputun altında olup biteni açıklayan mükemmel bir blog post.

İlgili konular