我是个初来乍到的人,今天几乎一整天都在和这个问题作斗争.
考虑到我有这些:
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{}吗?