2 回答

TA贡献1797条经验 获得超4个赞
您可以使用 的Call或CallSlice方法reflect.Value将其作为函数调用。与所有reflect.Value方法一样,这种恐慌是fn错误的类型。
func Invoke(fn interface{}, args ...string) {
v := reflect.ValueOf(fn)
rargs := make([]reflect.Value, len(args))
for i, a := range args {
rargs[i] = reflect.ValueOf(a)
}
v.Call(rargs)
}
http://play.golang.org/p/xGmNLDcLL_

TA贡献1795条经验 获得超7个赞
您可以使用这样的类型开关http://play.golang.org/p/opotbIGdrA
package main
import "fmt"
func PrintThis(arg string) {
fmt.Printf("I'm printing %s", arg)
}
func PrintThisAndThat(arg1, arg2 string) {
fmt.Printf("Now printing %s and %s", arg1, arg2)
}
func Invoke(fn interface{}, args ...string) {
switch m := fn.(type) {
case func(string):
m(args[0])
case func(string, string):
m(args[0], args[1])
default:
}
}
func main() {
Invoke(PrintThis, "foo")
Invoke(PrintThisAndThat, "foo", "bar")
}
但是您需要知道将传递哪些函数以使其正常工作。
顺便说一句,您可以PrintThis通过使用...string而不是多个字符串参数来转换为可变参数函数。
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报