我是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
使用此代码在运行时不应有任何性能损失。但是,有人可以考虑不使用接口{}来实现此功能的另一种方法吗?
你不能,这是一个不同的类型,你可以只使用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)()
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句