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

时间:2015-10-08 04:26:31

标签: go

假设我有两个像

这样的包
  

-a

     

-b

a 有一些像这样的方法

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

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

修改: 我已阅读reflect。但是reflect需要一个结构,并且函数是该结构的成员。如果我的函数不是结构的成员怎么办?只是包中的普通方法。调用方法和调用方法在不同的包中。然后?

NB。可能有一些方法也有参数。

2 个答案:

答案 0 :(得分:5)

就像LightWeight在他的回答中所说,你可以使用反射。

使用reflect.ValueOf方法获取类型的值。然后,您可以使用MethodByName方法获取函数值。获得函数值后,可以调用Call方法执行它。

代码示例

package main

import (
    "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
}

答案 1 :(得分:0)

您可以尝试使用反射。此链接可能对您有所帮助 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}