2015-01-06 6 views
8

Ich habe gelesen "Effektive Go" und andere Q & Wie so: golang interface compliance compile type check, aber dennoch kann ich nicht richtig verstehen, wie man diese Technik verwendet.Erläuterung der Überprüfung, ob value Schnittstellen implementiert. Golang

Bitte, siehe Beispiel:

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 
} 

Gibt es eine einfache Art und Weise (zB ohne Reflexion verwendet wird) Prüfwert, wenn es eine Schnittstelle implementiert?

+1

wie etwa _, ok: = interface {} (val) (Somether).? – c0ming

Antwort

14

Sie müssen nur prüfen, ob ein Wert eine Schnittstelle implementiert, wenn Sie den Werttyp nicht kennen. Wenn der Typ bekannt ist, wird diese Überprüfung automatisch vom Compiler durchgeführt.

Wenn Sie wirklich sowieso überprüfen möchten, können Sie es tun mit der zweiten Methode, die Sie haben:

var _ Somether = (*MyType)(nil) 

, die zum Zeitpunkt kompilieren würde Fehler:

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] 

Was Sie hier tun, weist einer Variablen vom Typ Somether einen Zeiger MyType type (und nil value) zu, aber da der Variablenname _ ist, wird er ignoriert.

Wenn MyTypeSomether umgesetzt, wäre es kompilieren und nichts tun

+0

danke für die Erklärung! –

+0

Gibt es einen Grund, warum der schwarze Bezeichner nicht unbedingt "* Etwas" sein muss, da die rechte Hand einen * Zeiger * auf "MyType" hat? Ich lerne immernoch. :-) –

+0

Sie können sich einen Interface-Wert wie einen Container vorstellen, Sie können setzen, was Sie wollen, solange es die richtigen Methoden implementiert. Es kann einen Zeiger auf eine Struktur oder eine Struktur direkt enthalten. Als Faustregel gilt, dass Sie nie einen Zeiger auf einen Schnittstellenwert erstellen müssen –

Verwandte Themen