golang中根据字符串执行制定的方法:
1、建立一个字典表
func func1(a string) string { fmt.Println("func1", a) return "f1" } func func2(a string) string { fmt.Println("func2", a) return "f2" } func TestReflect(t *testing.T) { a := "test" symbol := map[string]func(string) string{"func1": func1, "func2": func2} fmt.Println(symbol["func2"](a)) }
这里比较简单,go语言中方法也是一种类型,所以完全可以这么写,但是这个有个局限,就是所有映射的方法的入参和返回必须要一样
2、使用reflact反射,核心思想一样,也是要建立一个映射表,好处是映射的方法的入参和返回不需要保持一致
func func1(b int, a string) (string, string) { fmt.Println("func1", a) return "f1", "b1" } func func2(a string) string { fmt.Println("func2", a) return "f2" } func TestReflect(t *testing.T) { funMap := make(ControllerMapsType, 0) vf := reflect.ValueOf(func1) vf.Type().NumIn() funMap["func1"] = vf vf2 := reflect.ValueOf(func2) vf2.Type().NumIn() funMap["func2"] = vf2 params := []interface{}{11, "aa"} in := make([]reflect.Value, len(params)) for k, param := range params { in[k] = reflect.ValueOf(param) } result := funMap["func1"].Call(in) // result是一个数组 fmt.Println(result)
}