假设我有两个像
这样的包-a
-b
a 有一些像这样的方法
func TestOne() { //something }
func TestTwo() { //something }
我需要从包 b 调用包 a 的方法,但只能使用字符串方法名称。就像我得到字符串“TestOne”并调用方法TestOne()。我怎么能做到这一点。
修改:
我已阅读reflect
。但是reflect
需要一个结构,并且函数是该结构的成员。如果我的函数不是结构的成员怎么办?只是包中的普通方法。调用方法和调用方法在不同的包中。然后?
NB。可能有一些方法也有参数。
答案 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}