gpt4 book ai didi

go - interface{} 到函数类型转换

转载 作者:IT老高 更新时间:2023-10-28 13:08:05 26 4
gpt4 key购买 nike

我是 Go 新手,今天几乎整天都在与这个问题作斗争。

考虑到我有这些:

type HandlerType func()
var object interface{}
var typedObject HandlerType

可以将函数分配给 typedObject 变量,如下所示:

typedHandler = func() {
fmt.Println("in a handler!\n")
}

但我需要做的是将该处理函数作为 interface{} 变量传递,然后以某种方式将其转换为以后可以调用的 HandlerType

我已经尝试过了,但它会引发错误:

typedHandler = object.(HandlerType)

结果:

interface conversion: interface is func(), not main.HandlerType

基本上我需要在注册之前注册具有不同签名的函数而无需额外的类型转换。所以不要这样做:

registerHandler(HandlerTypeString(func() string { ... }))
registerHandler(HandlerTypeVoid(func() { ... }))

我想像这样注册处理程序:

registerHandler(func() string { ... })
registerHandler(func() { ... })

.. 我不想在稍后调用处理程序时涉及反射

有可能吗?

编辑:我创建了一个 Playground :http://play.golang.org/p/UlwqkHjt_P

据我所知,没有办法将一些任意函数作为 interface{} 传递,然后以某种方式将其转换为 HandlerType 或其他一些预定义的函数类型,这样我就可以在不使用的情况下调用它反射(reflection)?

Edit2:我想出了这个解决方案:http://play.golang.org/p/4gUxsgmiPf

此代码在运行时不应该有任何性能损失。但是有人能想出另一种不使用interface{}来实现此功能的方法吗?

最佳答案

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

关于go - interface{} 到函数类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24611416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com