2015-01-06 21 views
8

"Etkili Gitme" ve diğer Q &'u okudum. Bunun gibi: golang interface compliance compile type check, ancak yine de bu tekniği nasıl kullanacağımı tam olarak anlayamıyorum.Değer, arayüz uygulayıp uygulamadığının kontrol edilmesi. Golang

type Somether interface { 
    Method() bool 
} 

type MyType string 

func (mt MyType) Method2() bool { 
    return true 
} 

func main() { 
    val := MyType("hello") 

    //here I want to get bool if my value implements Somether 
    _, ok := val.(Somether) 
    //but val must be interface, hm..what if I want explicit type? 

    //yes, here is another method: 
    var _ Iface = (*MyType)(nil) 
    //but it throws compile error 
    //it would be great if someone explain the notation above, looks weird 
} 

bir arayüz uygulaması halinde denetim değerinin (örneğin yansıma kullanmadan) herhangi bir basit yolu var mı:

, örneğe bakın lütfen?

+1

nasıl _ ok: = arayüz {} (val) (somether).? – c0ming

cevap

14

Değerin türünü bilmiyorsanız, bir değerin bir arabirimi uygulayıp uygulamadığını kontrol etmeniz yeterlidir. Tür biliniyorsa, bu kontrol otomatik olarak derleyici tarafından yapılır.

gerçekten her durumda kontrol etmek isterseniz, size verdi ikinci yöntemi ile yapabilirsiniz:

var _ Somether = (*MyType)(nil) 

zaman derleme hatası olacaktır: Burada ne işin var

prog.go:23: cannot use (*MyType)(nil) (type *MyType) as type Somether in assignment: 
    *MyType does not implement Somether (missing Method method) 
[process exited with non-zero status] 

, MyType türünde (ve nil değeri) bir işaretçiyi Somether türünde bir değişkene atama, ancak değişken adı _ olduğu için göz ardı edilir. MyTypeSomether uygulanan

ise, hiçbir şey derlemek ve yapacağını

+0

Açıklama için teşekkürler! –

+0

Siyah tanımlayıcının zorunlu olarak * * Somether 'olması gerekmiyor, çünkü sağ elimde * MyType'a * * * işareti var mı? Ben hala öğreniyorum. :-) –

+0

Bir kapsayıcı gibi bir arabirim değeri düşünebilirsiniz, doğru yöntemleri uygular sürece istediğiniz her şeyi koyabilirsiniz. Bir yapıya veya doğrudan bir yapıya işaretçi içerebilir. Genel bir kural olarak, bir arayüz değeri için bir işaretçi yapmanıza gerek yoktur. –