如何检查对象是否具有特定方法?

tru*_*ted 18 go go-reflect

在Go中,如何检查对象是否响应方法?

例如,在Objective-C中,这可以通过以下方式实现:

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

eva*_*nal 31

一个简单的选择是使用您要检查的方法声明一个接口,然后针对您的类型执行类型断言;

 i, ok := myInstance.(InterfaceImplementingThatOneMethodIcareAbout)
 // inline iface delcataration example
 i, ok = myInstance.(interface{F()})
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 我真的鼓励人们使用类型断言而不是反映(或者,如果你没有其他需要命名一个方法iface,一个像uraimo建议的内联指定的匿名接口).更快,更短,无导入,没有字符串作为方法名称. (11认同)

Umb*_*ndi 19

如果obj是一个interface{}你可以使用Go类型断言:

if correctobj, ok := obj.(interface{methodName()}); ok { 
  correctobj.methodName() 
} 
Run Code Online (Sandbox Code Playgroud)