如何从Go中的字符串方法名称调用另一个包的方法

假设我有两个包

-一种

-b

有这样的一些方法

 func TestOne() { //something }
 func TestTwo() { //something }

我需要从包b 中调用包a的方法,但只能通过字符串方法名称。就像我得到字符串“TestOne”并调用方法 TestOne() 一样。我怎样才能做到这一点。

编辑: 我已经阅读了reflect。但reflect需要一个结构和函数是该结构的成员。如果我的函数不是结构的成员怎么办?只是一个包中的简单方法。并且调用方法和被调用方法在不同的包中。然后?

注意。可能有一些方法也有参数。


长风秋雁
浏览 247回答 2
2回答

叮当猫咪

就像 LightWeight 在他的回答中所说的那样,您可以使用反射。您使用reflect.ValueOf 方法来获取类型的值。然后可以使用 MethodByName 方法来获取函数值。获得函数值后,您可以调用 Call 方法来执行它。代码示例package mainimport (    "fmt"    "reflect")type TypeOne struct {}func (t *TypeOne) FuncOne() {    fmt.Println("FuncOne")}func (t *TypeOne) FuncTwo(name string) {    fmt.Println("Hello", name)}func CallFuncByName(myClass interface{}, funcName string, params ...interface{}) (out []reflect.Value, err error) {    myClassValue := reflect.ValueOf(myClass)    m := myClassValue.MethodByName(funcName)    if !m.IsValid() {        return make([]reflect.Value, 0), fmt.Errorf("Method not found \"%s\"", funcName)    }    in := make([]reflect.Value, len(params))    for i, param := range params {        in[i] = reflect.ValueOf(param)    }    out = m.Call(in)    return}func main() {    t1 := &TypeOne{}    out, err := CallFuncByName(t1, "FuncOne")    if err != nil {        panic(err)    }    //Return value    _ = out    out, err = CallFuncByName(t1, "FuncTwo", "monkey")    if err != nil {        panic(err)    }    //Return value    _ = out}

Cats萌萌

您可以尝试在 go 中使用反射。此链接可能对您有所帮助 https://golang.org/pkg/reflect/ 和http://mikespook.com/2012/07/function-call-by-name-in-golang/func foo() {    // bla...bla...bla...}func bar(a, b, c int) {    // bla...bla...bla...}funcs := map[string]interface{}{"foo":foo, "bar":bar}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go