我是个初来乍到的人,今天几乎一整天都在和这个问题作斗争.

考虑到我有这些:

type HandlerType func()
var object interface{}
var typedObject HandlerType

can将函数赋给typedObject变量,如下所示:

typedHandler = func() {
    fmt.Println("in a handler!\n")
}

但我需要做的是将处理程序函数作为interface{}变量传递,然后以某种方式将其转换为HandlerType,稍后我可以调用它

我try 过这个,但它抛出了一个错误:

typedHandler = object.(HandlerType)

结果如下:

接口转换:接口是func(),而不是main.HandlerType

基本上,在注册之前,我需要注册具有不同签名的函数,而不需要额外的类型转换.因此,与其这样做,不如:

registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))

我想像这样注册处理程序:

registerHandler(func() string { ... })
registerHandler(func() { ... })

..并且我不想在稍后的处理程序调用时涉及反射

有可能吗?

Edit:我创建了一个playground :http://play.golang.org/p/UlwqkHjt_P

因此,据我所知,没有办法将某个任意函数作为interface{}传递,然后以某种方式将其转换为HandlerType或其他预定义的函数类型,这样我就可以在不使用反射的情况下调用它.

Edit2:我想出了这个解决方案:http://play.golang.org/p/4gUxsgmiPf

使用此代码在运行时不应该有任何性能损失.但是,有人能想出另一种方法来实现这个功能,而不使用interface{}吗?

推荐答案

你不能,这是另一种类型,你可以用object.(func())object.(func() string)等等.

func main() {
    type HandlerType func()
    var object interface{} = func() {
        fmt.Println("eureka!")
    }
    if f, ok := object.(func()); ok {
        HandlerType(f)()
    }
}

Go相关问答推荐

Go汇编器命名为Constants

GitHub发布Golang子模块

GORM Find(&;Room)操作使用空数据而不是实际数据填充 struct

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

Go SQLCMD比Windows本机版本慢吗?

埃拉托塞尼筛:加快交叉关闭倍数步骤

如何在Golang中覆盖404

一次打印用户输入的字符串n次

仅使用公共 api 对 alexedwards/scs 进行简单测试

Go Template 动态获取变量

使用Goldmark在golang中添加ChildNode会导致堆栈溢出

如何测试光纤参数

在 Cloud Run 中找不到默认凭据

使用 Go 根据 /etc/shadow 文件中的散列密码验证密码

整理时转换值

如何在自定义验证函数中获取 struct 名称

处理程序后访问 HTTP 请求上下文

关系不存在 GORM

HTTP 重定向不呈现新页面

如何从 docker-compose 命令运行 2 个不同的命令: