我有一个类似于以下的代码
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) { //fn(args...) } func main() { Invoke(PrintThis, "foo") Invoke(PrintThisAndThat, "foo", "bar") }
这不是实际的生产代码,但这是简化的版本。
问题:-如果取消注释该行,则会//fn(args...)出现编译错误prog.go:14: cannot call non-function fn (type interface {})
//fn(args...)
prog.go:14: cannot call non-function fn (type interface {})
如何执行通过Invoke()函数作为参数接收的函数?
什么是实现此目标的正确方法?
您可以使用的Call或CallSlice方法reflect.Value将其作为函数调用。与所有reflect.Value方法一样,这种恐慌是fn错误的类型。
Call
CallSlice
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_