Как проверить, имеет ли объект определенный метод?

В Go, как вы проверяете, отвечает ли объект методу?

Например, в Objective-C это можно сделать, выполнив:

if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
  [obj methodName:42]; // call the method
}

Ответы

Ответ 1

Простая опция - объявить интерфейс только с помощью метода, который вы хотите проверить, а затем сделать тип assert против вашего типа, например:

 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

Ответ 2

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

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