在GoLang中将字符串转换为func类型

时间:2018-12-02 11:07:53

标签: go

我有一个字符串,它是GoLang中函数的名称。 我想将它们视为功能。我应该怎么做?我试图通过反射来实现这一目标。*但我没有找到有效的途径。

我在JSON文件中获得处理程序的名称,并且我想执行这些处理程序。像这样:

{
  "students/show" : "ShowStudents",
  "students/add" : "AddStudents"
}

然后我要执行ShowStudents(),但是不知道如何将其视为类型为func的变量

2 个答案:

答案 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. 提取函数名称
  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)
}

Run this example