Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何检查对象是否有特定的方法?_Go_Go Reflect - Fatal编程技术网

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

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

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

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

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)

}