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)
}