Go 如何检查对象是否有特定的方法?
在Go中,如何检查对象是否响应方法 例如,在目标C中,这可以通过以下方式实现:Go 如何检查对象是否有特定的方法?,go,go-reflect,Go,Go Reflect,在Go中,如何检查对象是否响应方法 例如,在目标C中,这可以通过以下方式实现: if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists [obj methodName:42]; // call the method } 一个简单的选择是声明一个只包含您想要检查的方法的接口,然后针对您的类型执行类型断言,如 i, ok := myInstance.(InterfaceImplementingTha
if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
[obj methodName:42]; // call the method
}
一个简单的选择是声明一个只包含您想要检查的方法的接口,然后针对您的类型执行类型断言,如
i, ok := myInstance.(InterfaceImplementingThatOneMethodIcareAbout)
// inline iface delcataration example
i, ok = myInstance.(interface{F()})
如果你打算对你的类型做一些太疯狂的事情,你可能想使用reflect
包
如果obj是一个
接口{}
,则可以使用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()
}
i、 e
我真的鼓励人们使用类型断言而不是反射(或者,如果您没有其他需要命名一个方法iface,一个像uraimo建议的那样内联指定的匿名接口,那就更好了)。更快、更短、无需导入、无需字符串作为方法名。@Two同意。我认为,只有当您要进行大量检查,从而做出有关如何行为的运行时决策时,反射才真正有意义。如果您只是想看看是否可以调用一个方法,iface选项会简单得多,如果您只在一个地方使用它,那么内联匿名声明也会更好。那么我如何使用
m
,因为它是reflect.method
type?这是一个很好的示例答案,但您能否解释一下接口{methodName()}
在类型断言中工作?(为什么)与简单的接口{}
相比,接口{methodName()}
是类型匹配,并且(为什么)即使接口有其他方法,它也能工作?那么我如何使用correctobj.methodName()
值x:=correcorrectobj.methodName()
给出错误correctobj.methodName()用作值
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)
}