web-dev-qa-db-ja.com

オブジェクトに特定のメソッドがあるかどうかを確認するにはどうすればよいですか?

Goでは、オブジェクトがメソッドに応答するかどうかをどのように確認しますか?

たとえば、Objective-Cでは、これは次の方法で実現できます。

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

簡単なオプションは、チェックしたいメソッドだけでインターフェースを宣言してから、次のような型に対して型アサートを実行することです。

 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
31
evanmcdonnal

Objがinterface{}の場合、Goタイプのアサーションを使用できます。

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