【发布时间】:2014-08-27 23:37:09
【问题描述】:
我是 Go 新手,今天几乎整天都在与这个问题作斗争。
考虑到我有这些:
type HandlerType func()
var object interface{}
var typedObject HandlerType
我可以将函数分配给 typedObject 变量,如下所示:
typedHandler = func() {
fmt.Println("in a handler!\n")
}
但我需要做的是将该处理函数作为 interface{} 变量传递,然后以某种方式将其转换为以后可以调用的 HandlerType
我试过了,但它会抛出一个错误:
typedHandler = object.(HandlerType)
结果:
接口转换:接口是func(),不是main.HandlerType
基本上我需要在注册之前注册具有不同签名的函数而无需额外的类型转换。所以不要这样做:
registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))
我想像这样注册处理程序:
registerHandler(func() string { ... })
registerHandler(func() { ... })
.. 我不想在稍后调用处理程序时涉及反射
有可能吗?
编辑:我创建了一个游乐场:http://play.golang.org/p/UlwqkHjt_P
据我所知,没有办法将一些任意函数作为 interface{} 传递,然后以某种方式将其转换为 HandlerType 或其他一些预定义的函数类型,这样我就可以在不使用的情况下调用它反思?
Edit2:我想出了这个解决方案:http://play.golang.org/p/4gUxsgmiPf
此代码在运行时不应该有任何性能损失。但是有人能想出另一种不使用interface{}来实现此功能的方法吗?
【问题讨论】:
-
显示完整代码。如果对象(
interface {}类型)确实包含HandlerType的对象,typedHandler = object.(HandlerType)将工作。显示可在操场上播放的代码。 -
还有一点:如果您是 Go 新手,您应该避免使用
interface{}。寻找其他方式,编写正确的 Go 代码。一个新人的interface{}魔法闻起来像是其他语言的代码音译。 -
我添加了一个游乐场,我认为我已经明确了我想要完成的事情:)
标签: go