【问题标题】:interface{} to function type conversioninterface{} 到函数类型转换
【发布时间】: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


【解决方案1】:

你不能,它是不同的类型,你可以使用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)()
    }
}

【讨论】:

  • 谢谢!现在我已经知道如何实现我想要的了。 play.golang.org/p/4gUxsgmiPf
  • 实际上,对于特定模式,您最好使用@Elwinar 建议的界面。
【解决方案2】:

您的问题中有一些小的误解:

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

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

  3. func() 不是HandlerType,即使HandlerTypetype HandlerType func() 定义。定义与此无关。

你想做的事情是不可能的。我不是反思专家,但我认为反思也不能解决您的问题。

也就是说,你的注册方法应该定义一个所有注册对象都应该实现的接口,并使用这个接口作为参数类型。以database/sqlRegister 方法为例。

【讨论】:

    【解决方案3】:

    您现在可以使用reflect.MakeFunc 执行此操作,那里有一个示例说明如何执行此操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 2014-04-10
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2016-10-15
      • 2014-02-14
      相关资源
      最近更新 更多