我有一个字符串,它是GoLang中函数的名称。 我想将它们视为功能。我应该怎么做?我试图通过反射来实现这一目标。*但我没有找到有效的途径。
我在JSON文件中获得处理程序的名称,并且我想执行这些处理程序。像这样:
{
"students/show" : "ShowStudents",
"students/add" : "AddStudents"
}
然后我要执行ShowStudents()
,但是不知道如何将其视为类型为func
的变量
答案 0 :(得分:2)
在json文件中的键和函数之间建立映射,然后使用它们来调用json中出现的函数
package main
import (
"encoding/json"
"fmt"
)
func AddStudents() {
fmt.Println("woo")
}
func ShowStudents() {
fmt.Println("lots of students")
}
func main() {
js := `{
"students/show" : "ShowStudents",
"students/add" : "AddStudents"
}`
lookup := make(map[string]string)
json.Unmarshal([]byte(js), &lookup)
dispatch := make(map[string]func())
dispatch["students/show"] = ShowStudents
dispatch["students/add"] = AddStudents
for v, _ := range lookup {
print(v)
dispatch[v]()
}
}
答案 1 :(得分:2)
您的任务可以分为两个步骤:
对于步骤1,我会将JSON解组为map [string] string,如下所示:
b, err := ioutil.ReadFile(fname)
mp := make(map[string]string)
json.Unmarshal(b, &mp)
进入步骤2。在Go中,不可能将string
直接转换为函数调用,但是可以使用reflect
包枚举对象的方法。在这种情况下,可以将其用作解决方法。与其直接编写这些函数,不如将它们绑定到一个虚拟类型,就像这样:
type T int
func (t T) ShowStudents() {
fmt.Println("Showing Students")
}
func (t T) AddStudents() {
fmt.Println("Adding Students")
}
func main() {
var t T
reflect.ValueOf(t).MethodByName("ShowStudents").Call(nil)
}