在 Go 中,如何检查对象是否响应方法?
例如,在 Objective-C 中,这可以通过执行以下操作来实现:
if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
[obj methodName:42]; // call the method
}
在 Go 中,如何检查对象是否响应方法?
例如,在 Objective-C 中,这可以通过执行以下操作来实现:
if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
[obj methodName:42]; // call the method
}
一个简单的选择是仅使用您要检查的方法声明一个接口,然后对您的类型进行类型断言,例如;
i, ok := myInstance.(InterfaceImplementingThatOneMethodIcareAbout)
// inline iface declaration 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
} else {
// do something like invoke m.F
}
如果 obj 是 aninterface{}
你可以使用 Go 类型断言:
if correctobj, ok := obj.(interface{methodName()}); ok {
correctobj.methodName()
}
除了@evanmcdonnal 在接口大括号 {write_function_declaration_here} 内的解决方案之外,您将编写函数声明
if correctobj, ok := obj.(interface{methodName(func_arguments_here)(return_elements_here)}); ok {
x,... := correctobj.methodName()
}
IE
package main
import "fmt"
type test struct {
fname string
}
func (t *test) setName(name string) bool {
t.fname = name
return true
}
func run(arg interface{}) {
if obj, ok := arg.(interface{ setName(string) bool });
ok {
res := obj.setName("Shikhar")
fmt.Println(res)
fmt.Println(obj)
}
}
func main() {
x := &test{
fname: "Sticker",
}
fmt.Println(x)
run(x)
}