如何检查对象是否具有特定方法?
How to check if an object has a particular 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 是一个 interface{}
你可以使用 Go 类型断言:
if correctobj, ok := obj.(interface{methodName()}); ok {
correctobj.methodName()
}
除了接口大括号{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)
}
在 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 是一个 interface{}
你可以使用 Go 类型断言:
if correctobj, ok := obj.(interface{methodName()}); ok {
correctobj.methodName()
}
除了接口大括号{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)
}