Golang 类型断言/转换为中间结构

标签 go go-interface

给定以下类型:

type Event interface{}

type ActionResultEvent struct {
    Result string
}

type ActionSuccessEvent ActionResultEvent
type ActionFailureEvent ActionResultEvent

type eventHandleFunc func(e Event)

我的目标是为具体类型 ActionSuccessEventActionFailureEvent 以及更多抽象 ActionResultEvent。我想将后者用于 ActionSuccessEventActionFailureEvent

现在我的想法是将 Event 接口(interface)类型转换为我想要处理的结构,这非常适合具体类型。

// Working perfectly fine
func(e Event) {
  event := e.(ActionFailureEvent)
  fmt.Println(event.Result)
} (ActionFailureEvent{ Result: "failure" })

func(e Event) {
  event := e.(ActionSuccessEvent)
  fmt.Println(event.Result)
} (ActionSuccessEvent{ Result: "success" }) 

现在处理程序接受 ActionResultEvent 怎么样?我最喜欢的是这个:

func(e Event) {
  event := e.(ActionResultEvent)
  fmt.Println(event.Result)
} (ActionSuccessEvent{ Result: "success" })    

这显然是 panic ,因为 eActionSuccessEvent 类型。

然后我们当然可以转换为初始类型并返回中间类型:

// Works but would that would need to change whenever new types "extending" 
// ActionResultEvent are added
func(e Event) {
  var resultEvent ActionResultEvent

  switch e.(type) {
  case ActionSuccessEvent:
    resultEvent = ActionResultEvent(e.(ActionSuccessEvent))

  case ActionFailureEvent:
    resultEvent = ActionResultEvent(e.(ActionFailureEvent))
  }
  fmt.Println(resultEvent.Result)
} (ActionSuccessEvent{ Result: "success" })

从我的角度来看,另一个非常好的方法是:

// Error: use of e.(type) outside type switch
func(e Event) {
  resultEvent := ActionResultEvent(e.(type))
} (ActionSuccessEvent{ Result: "success" })

有人能想出一个顺利的解决方案吗?一方面说明:如果处理程序在运行时每当类型转换失败时出现 panic ,我会很高兴,因为包装器将从中恢复。

这是上面关于 playground 的示例代码.谢谢!

最佳答案

虽然我在这里得到了反对票,但我相信这可能会引起其他人的兴趣。所以我决定将解决方案发布到我认为有效的地方:参见 playground

如果这是不好的做法或者不是做事的“可行方式”,我真的很乐意得到一些反馈。谢谢!

关于Golang 类型断言/转换为中间结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483263/

相关文章:

go - 为什么我将 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

go - 如何检查一个包直接依赖/间接依赖另一个包?

go - 在golang中将Json.Number转换成int/int64/float64

go - 接口(interface)类型和值可以是不实现接口(interface)及其值的类型吗?

xml - Golang Google 警报 XML 解析

string - golang - 字符串排列 - slice 边界超出范围

file - go - 将 stderr 重定向到文件和 stdout

go - 了解接口(interface)中的接口(interface)(嵌入式接口(interface))

pointers - 在 Go 中,我如何检查一个值是(任何)指针类型?

go - 如何将 nil 接口(interface)转换为 nil 其他接口(interface)