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

时间:2015-04-16 19:48:33

标签: go go-reflect

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

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

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

3 个答案:

答案 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)

}