为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
守候你守候我 2021-12-20 10:54:53
我有一个类似于以下的代码package 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) {    //fn(args...)}func main() {    Invoke(PrintThis, "foo")    Invoke(PrintThisAndThat, "foo", "bar")}这不是实际的生产代码,但这是一个简化版本。问题 :- 如果我取消注释该行,则会//fn(args...)出现编译错误prog.go:14: cannot call non-function fn (type interface {})如何执行作为 Invoke() 函数的参数接收的函数?实现这一目标的正确方法是什么?
查看完整描述

2 回答

?
繁星coding

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_


查看完整回答
反对 回复 2021-12-20
?
一只萌萌小番薯

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而不是多个字符串参数来转换为可变参数函数。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号