猿问

调用在 golang 中作为接口变量接收的函数

我有一个类似于以下的代码


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 {})


如何执行作为 Invoke() 函数的参数接收的函数?


实现这一目标的正确方法是什么?


守候你守候我
浏览 191回答 2
2回答

繁星coding

您可以使用 的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_

一只萌萌小番薯

您可以使用这样的类型开关http://play.golang.org/p/opotbIGdrApackage mainimport "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而不是多个字符串参数来转换为可变参数函数。
随时随地看视频慕课网APP

相关分类

Go
我要回答