不能在赋值中使用(类型字符串)作为func()类型

时间:2019-08-18 14:06:04

标签: go

我有以下格式的yaml文件:

checks:
      CheckIPReachability:
        args:
          ip: 127.0.0.1
          port: 22
      xyz_check:
        args:
          xyz_arg: xxx
          xyz_arg1: yy

我计划接受用户的这种类型的输入,并调用CheckIPReachability或任何xyz函数,并将args发送给它。各个函数将提取args并执行任务。

我试图这样做,

m := make(map[string]func())

for prp, val := range checks {
  m["func"] = prp.(func())
  m["func"]()
}

失败,并显示以下信息:

  

panic:接口转换:interface {}是字符串,不是func()

因此prp是“ CheckIPReachability”,尽管将其转换为func,但我无法将其称为函数。

我也想知道什么是最好的方法(接口?)。添加开关盒看起来并不正确。

https://play.golang.org/p/B9w6p4MCI7V

1 个答案:

答案 0 :(得分:1)

您不能将字符串转换为函数。您可以尝试使用某种映射,例如:

checkers := map[string]func() {
    "CheckIPReachability": checkIPReachability,
}

checkers[name]()

如果您需要传递参数,该函数将类似于:

func checkIPReachability(args []interface{}) {
    // convert args and check the IPs
}

checkers := map[string]func([]interface{}) {
    "CheckIPReachability": "checkIPReachability",
}

如果要允许框架的用户添加自己的检查器,则可以将其导出为功能RegisterChecker(string, func(interface{}))或类似的功能。

一个更简单的选择是switch-case语句:

switch funcname {
    case "CheckIPReachability":
        // convert arguments and call the function
    case "OtherCheck":
        // same here
}