2015-04-16 17 views

risposta

27

Una soluzione semplice è di dichiarare un'interfaccia con solo il metodo che si desidera controllare e poi fare un tipo di assert contro la vostra tipo come;

i, ok := myInstance.(InterfaceImplementingThatOneMethodIcareAbout) 
// inline iface delcataration example 
i, ok = myInstance.(interface{F()}) 

È probabile che desidera utilizzare il pacchetto reflect se avete intenzione di fare qualsiasi cosa troppo pazzo con il tuo tipo; http://golang.org/pkg/reflect

st := reflect.TypeOf(myInstance) 
m, ok := st.MethodByName("F") 
if !ok { 
    // method doesn't exist 
} 
// do something like invoke m 
+11

Mi piacerebbe davvero incoraggiare la gente a utilizzare il tipo di affermazione, piuttosto che riflettere (o, meglio se non avete altro bisogno per nominare iface a un metodo, è suggerita un'interfaccia anonima specificata in linea come uraimo). Più veloce, più breve, nessuna importazione, nessuna stringa come nome del metodo. – twotwotwo

+0

@twotwotwo concordato. Penso che riflettere abbia davvero senso se si sta andando a fare un sacco di controlli che portano a decisioni runtime su come comportarsi. Se vuoi solo vedere se puoi o meno invocare un metodo, l'opzione iface è molto più semplice e se la stai solo usando in un posto la dichiarazione anonima inline è anche meglio. – evanmcdonnal

17

Se obj è un interface{} è possibile utilizzare Go Tipo asserzioni:

if correctobj, ok := obj.(interface{methodName()}); ok { 
    correctobj.methodName() 
} 
Problemi correlati