我有以下格式的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,但我无法将其称为函数。
我也想知道什么是最好的方法(接口?)。添加开关盒看起来并不正确。
答案 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
}