当使用任何接口作为参数时,简化Go中的强制转换



我有一个像这样的结构体

//
// HandlerInfo is used by features in order to register a gateway handler
type HandlerInfo struct {
Fn     func(interface{})
FnName string
FnRm   func()
}

我想传递一个函数:

func StarboardReactionHandler(e *gateway.MessageReactionAddEvent) {
// foo
}
i := HandlerInfo{Fn: StarboardReactionHandler}

不幸的是,这会导致:

Cannot use 'StarboardReactionHandler' (type func(e *gateway.MessageReactionAddEvent)) as the type func(interface{})

我找到了这个解决方法:

func StarboardReactionHandler(e *gateway.MessageReactionAddEvent) {
// foo
}
func handlerCast(e interface{}) {
StarboardReactionHandler(e.(*gateway.MessageReactionAddEvent))
}
i := HandlerInfo{Fn: handlerCast}

是否有某种方法可以简化需要handlerCast,例如在我的StarboardReactionHandlerHandlerInfo中进行?也许使用泛型或反射?我基本上只是想尽量减少这里需要的语法/样板文件。

可以使用interface{}.(type)

是一个例子:

package main
import "fmt"
type HandlerInfo struct {
Fn     func(interface{})
FnName string
FnRm   func()
}
type MessageReactionAddEvent = func(a, b int) int
func StarboardReactionHandler(e interface{}) {
switch e.(type) {
case MessageReactionAddEvent:
fmt.Printf("%vn", (e.(MessageReactionAddEvent))(1, 2))
}
}
func add(a, b int) int {
return a + b
}
func main() {
i := HandlerInfo{Fn: StarboardReactionHandler}
i.Fn(add)
}

相关内容

  • 没有找到相关文章

最新更新