在Go中,如何检查对象是否响应方法?
例如,在Objective-C中,这可以通过以下方式实现:
if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
[obj methodName:42]; // call the method
}
答案 0 :(得分:29)
一个简单的选择是使用您要检查的方法声明一个接口,然后针对您的类型执行类型断言,如;
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
答案 1 :(得分:19)
如果obj是interface{}
,你可以使用Go类型断言:
if correctobj, ok := obj.(interface{methodName()}); ok {
correctobj.methodName()
}
答案 2 :(得分:0)
在接口大括号{write_function_declaration_here}里面除了@evanmcdonnal的解决方案,你还要写函数声明
if correctobj, ok := obj.(interface{methodName(func_arguments_here)(return_elements_here)}); ok {
x,... := correctobj.methodName()
}
即
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)
}