interface {}到函数类型转换

sta*_*.sm 11 go

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

考虑到我有这些:

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

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

One*_*One 9

你不能,这是一个不同的类型,你可以只使用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)()
    }
}
Run Code Online (Sandbox Code Playgroud)


Elw*_*nar 8

你的问题中存在一些小的误解:

  1. 类型断言不用于强制转换类型.它只是检查变量是否为给定类型并将变量作为此基础类型返回.此操作在您的情况下返回错误,这是正常的,因为它func()不是类型HandlerFunc.

  2. 您无需执行任何操作即可将变量作为参数传递给函数接受interface{}.每种类型都隐式实现空接口.

  3. A func()不是a HandlerType,即使HandlerType是由a 定义的type HandlerType func().该定义与此无关.

你想做什么是不可能的.我不是反思专家,但我认为反思也不能解决你的问题.

也就是说,您的注册方法应该定义所有注册对象应该实现的接口,并使用此接口作为参数类型.查看database/sqlRegister方法的示例.