2015-01-06 4 views
8

Ho letto "Effective Go" e altro Q & In questo modo: golang interface compliance compile type check, ma tuttavia non riesco a capire correttamente come utilizzare questa tecnica.Spiegazione di controllo se interfaccia valore implementa. Golang

prega, vedere Esempio:

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 
} 

È stato rilevato qualche modi semplici (ad esempio, senza l'utilizzo di riflessione) il valore di controllo se si implementa un'interfaccia?

+1

come su _, ok: = interfaccia {} (val) (Somether).? – c0ming

risposta

14

È necessario solo verificare se un valore implementa un'interfaccia se non si conosce il tipo di valore. Se il tipo è noto, tale controllo viene eseguito automaticamente dal compilatore.

Se davvero si vuole controllare in ogni modo, è possibile farlo con il secondo metodo che hai dato:

var _ Somether = (*MyType)(nil) 

che sarebbe errore in fase di compilazione:

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] 

Quello che state facendo qui, sta assegnando un puntatore del tipo MyType (e il valore nil) a una variabile di tipo Somether, ma poiché il nome della variabile è _ non viene preso in considerazione.

Se MyType implementato Somether, sarebbe compilare e non fare nulla

+0

grazie per la spiegazione! –

+0

Qualsiasi motivo per cui l'identificatore nero non deve necessariamente essere '* Somether', poiché la mano destra ha un * puntatore * in' MyType'? Sto ancora imparando. :-) –

+0

puoi pensare ad un valore di interfaccia come un contenitore, puoi mettere tutto ciò che vuoi in esso finché implementa i giusti metodi. Può contenere un puntatore a una struct o una struct direttamente. Come regola generale non è mai necessario creare un puntatore a un valore di interfaccia –