Утверждение типа Голанга / приведение к промежуточной структуре
Даны следующие виды:
type Event interface{}
type ActionResultEvent struct {
Result string
}
type ActionSuccessEvent ActionResultEvent
type ActionFailureEvent ActionResultEvent
type eventHandleFunc func(e Event)
Моя цель - иметь обработчики событий (типа eventHandleFunc
) для конкретных типов ActionSuccessEvent
, ActionFailureEvent
, а также для более абстрактного ActionResultEvent
, Последний я хотел бы использовать для обоих ActionSuccessEvent
с и ActionFailureEvent
s.
Теперь моя идея состояла в том, чтобы просто набрать 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" })
Теперь насчет принятия обработчиков ActionResultEvent
s? Мой абсолютный фаворит выглядел бы так:
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 ответ
Хотя я получил здесь голоса, я считаю, что это может быть интересно другим. Поэтому я решил опубликовать решение того, что я понял, чтобы работать: посмотреть на игровую площадку
Если это плохая практика или нет, то я буду очень рад получить обратную связь. Спасибо!