小编sta*_*.sm的帖子

interface {}到函数类型转换

我是一个新手,我几乎整天都在和这个问题作斗争.

考虑到我有这些:

type HandlerType func()
var object interface{}
var typedObject HandlerType
Run Code Online (Sandbox Code Playgroud)

可以像这样为typedObject变量赋一个函数:

typedHandler = func() {
    fmt.Println("in a handler!\n")
}
Run Code Online (Sandbox Code Playgroud)

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

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

typedHandler = object.(HandlerType)
Run Code Online (Sandbox Code Playgroud)

结果是:

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

基本上我需要在注册之前注册具有不同签名的函数而无需额外的类型转换.所以不要这样做:

registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
Run Code Online (Sandbox Code Playgroud)

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

registerHandler(func() string { ... })
registerHandler(func() { ... })
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

编辑:我创建了一个游乐场:http://play.golang.org/p/UlwqkHjt_P

所以据我所知,没有办法传递一些任意函数作为接口{},然后以某种方式将其转换为HandlerType或其他一些预定义的函数类型,所以我可以不使用反射调用它?

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

使用此代码在运行时期间不应有任何性能损失.但有人可以在没有接口{}的情况下想出实现此功能的另一种方法吗?

go

11
推荐指数
2
解决办法
6183
查看次数

标签 统计

go ×1