[英]interface{} to function type conversion
我是一个新手,我几乎整天都在和这个问题作斗争。
考虑到我有这些:
type HandlerType func()
var object interface{}
var typedObject HandlerType
我可以像这样为typedObject变量赋一个函数:
typedHandler = func() {
fmt.Println("in a handler!\n")
}
但我需要做的是将该处理函数作为接口{}变量传递,然后以某种方式将其转换为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
所以据我所知,没有办法传递一些任意函数作为接口{}然后以某种方式将其转换为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)()
}
}
你的问题中存在一些小的误解:
类型断言不用于强制转换类型。 它只是检查变量是否为给定类型并将变量作为此基础类型返回。 此操作在您的情况下返回错误,这是正常的,因为func()
不是HandlerFunc
类型。
在接受interface{}
的函数中,您无需执行任何操作即将变量作为参数传递。 每种类型都隐式实现空接口。
即使HandlerType
由type HandlerType func()
定义, func()
也不是HandlerType
。 该定义与此无关。
你想做什么是不可能的。 我不是反思专家,但我认为反思也不能解决你的问题。
也就是说,您的注册方法应该定义所有注册对象应该实现的接口,并将此接口用作参数类型。 查看database/sql
包Register
方法的示例。
您现在可以使用reflect.MakeFunc执行此操作。有关于如何执行此操作的示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.