Утверждение типа Голанга / приведение к промежуточной структуре

Даны следующие виды:

type Event interface{}

type ActionResultEvent struct {
    Result string
}

type ActionSuccessEvent ActionResultEvent
type ActionFailureEvent ActionResultEvent

type eventHandleFunc func(e Event)

Моя цель - иметь обработчики событий (типа eventHandleFunc) для конкретных типов ActionSuccessEvent, ActionFailureEvent, а также для более абстрактного ActionResultEvent, Последний я хотел бы использовать для обоих ActionSuccessEventс и ActionFailureEvents.

Теперь моя идея состояла в том, чтобы просто набрать Event интерфейс со структурой, над которой я хотел бы работать, и это хорошо работает для конкретных типов.

// 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" }) 

Теперь насчет принятия обработчиков ActionResultEvents? Мой абсолютный фаворит выглядел бы так:

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

Это явно паникует как e был типа ActionSuccessEvent,

Тогда мы, конечно, можем привести к начальному типу и обратно к промежуточному:

// 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" })

Кто-нибудь может придумать плавное решение? Примечание с одной стороны: я рад, что обработчик паникует во время выполнения, когда происходит сбой при типизации, так как оболочка восстановится после этого.

Это пример кода выше на детской площадке. Спасибо!

1 ответ

Хотя я получил здесь голоса, я считаю, что это может быть интересно другим. Поэтому я решил опубликовать решение того, что я понял, чтобы работать: посмотреть на игровую площадку

Если это плохая практика или нет, то я буду очень рад получить обратную связь. Спасибо!

Другие вопросы по тегам