26

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

例如,在 Objective-C 中,这可以通过执行以下操作来实现:

if ([obj respondsToSelector:@selector(methodName:)]) { // if method exists
  [obj methodName:42]; // call the method
}
4

3 回答 3

40

一个简单的选择是仅使用您要检查的方法声明一个接口,然后对您的类型进行类型断言,例如;

 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
}   
于 2015-04-16T19:59:51.757 回答
24

如果 obj 是 aninterface{}你可以使用 Go 类型断言:

if correctobj, ok := obj.(interface{methodName()}); ok { 
  correctobj.methodName() 
} 
于 2015-04-16T19:59:54.573 回答
0

除了@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)

}
于 2021-05-24T19:32:25.697 回答