2015-04-16 5 views

ответ

27

простой вариант, это объявить интерфейс только с методом, который вы хотите проверить, а затем сделать типа выдвинуть против вашего тип типа;

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

Вы, вероятно, хотите использовать reflect пакет, если вы планируете сделать что-нибудь слишком сумасшедший с вашим типом; 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

Я действительно поощрять людей, чтобы использовать утверждение типа, а не отражают (или, лучше, если у вас нет другой необходимости для имени one-method iface, анонимный интерфейс, указанный в строке, например uraimo). Быстрее, короче, без импорта, без строк в качестве имен методов. – twotwotwo

+0

@twotwotwo согласился. Я думаю, что отражение действительно имеет смысл, если вы собираетесь провести большую проверку, что приведет к принятию решений о том, как себя вести. Если вы просто хотите узнать, можете ли вы вызывать метод, параметр iface намного проще, и если вы используете его только в одном месте, то также будет включено анонимное объявление inline. – evanmcdonnal

17

Если OBJ является interface{} вы можете использовать Go утверждения типа:

if correctobj, ok := obj.(interface{methodName()}); ok { 
    correctobj.methodName() 
} 
Смежные вопросы