2014-06-26 20 views
13

ben varsa:golang: dönüştürmek yapı işaretçi arayüz {}

type foo struct{ 
    } 

    func bar(baz interface{}) { 
    } 

üstündeki taşlara ayarlanır - Ben foo ya da bar değiştiremez. Ek olarak, baz çubuğun içine bir foo struct pointer dönüştürülmelidir. & {} arayüzüne {} aramayı çağıran bir parametre olarak kullanabilmem için nasıl yapabilirim? Bir interface{} içine *foo açmak için

cevap

34

Önemsiz:

func bar(baz interface{}) { 
    f, ok := baz.(*foo) 
    if !ok { 
     // baz was not of type *foo. The assertion failed 
    } 

    // f is of type *foo 
} 

Veya type switch:

geri *foo almak için
f := &foo{} 
bar(f) // every type implements interface{}. Nothing special required 

, bir type assertion yapabilirsiniz ya (benzer, ancak baz birden çok türde olabilirse yararlıdır):

func bar(baz interface{}) { 
    switch f := baz.(type) { 
    case *foo: // f is of type *foo 
    default: // f is some other type 
    } 
} 
+0

Arabirim türünü bilmiyorsanız ne dersiniz? senin örneğindeki "baz" –

+5

@JuandeParras: Eğer ne türden baz 'olabileceğini bilmiyorsan, o zaman yansıma ile çalışmak zorundasın ('import' reflect ''). Bu, 'kodlama/json' gibi paketlerin, önceden bilmeden temel olarak herhangi bir türü kodlayabilmesidir. – ANisus

+0

Bunu dilimlerle yapmanın bir yolu var mı? – jocull