Присвойте переменную типу "label", или как печатать приведение между указателями - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть две идентичные структуры, которые в целях устранения неоднозначности имеют разные типы:

type BaseType struct {
   id  uint64
   name string
}

type LabeledType1 BaseType
type LabeledType2 BaseType

Есть одна функция во всей цепочке, которая на самом деле не заботится о LabeledType, она просто работает сBaseType (потому что он делает то же самое с обоими).Отправитель события должен отправить помеченный тип, а не базовый тип, потому что фактический тип определяет некоторое пост-поведение.

func handle(evt interface{}) error {
  switch e := evt.(type) {
  case *LabeledType1: 
    return handleBaseEvent(e)
  case *LabeledType2:
    return handleBaseEvent(e)
  //there are other types
  case *OtherType:
      return handleOtherType(e)
  } 
}

func handleBaseEvent(evt *BaseType) {
   //do stuff
}

Теперь, конечно, это не компилируется:

cannot convert e (type *LabeledType1) to type BaseType

Но мне интересно, оба типа присваиваются , насколько я понимаю эту концепцию, поэтому должно быть какое-то простое преобразование?Я пробовал приведение типа:

evt.(BaseType))

, а также

BaseType(e)

Я не могу использовать bool внутриBaseType.

1 Ответ

0 голосов
/ 24 сентября 2018

Используйте преобразование типа (*BaseType)() для преобразования *LabeledType1 и *LabeledType2 в *BaseType:

func handle(evt interface{}) error {
    switch e := evt.(type) {
    case *LabeledType1:
        return handleBaseEvent((*BaseType)(e))
    }
    ...
}

Запустите его на детской площадке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...