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

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)

}