将变量分配给“标签”类型,或如何在指针之间键入强制类型转换

时间:2018-09-24 16:03:45

标签: go types interface casting

我有两个相同的结构,为了消除歧义,它们具有不同的类型:

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 :(得分:5)

使用(*BaseType)() type conversion*LabeledType1*LabeledType2转换为*BaseType

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

Run it on the playground