首页 > 解决方案 > 将变量分配给“标签”类型,或如何在指针之间进行类型转换

问题描述

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

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)

我不能使用boolinside BaseType

标签: gotypesinterfacecasting

解决方案


使用(*BaseType)() 类型转换将 a*LabeledType1和转换*LabeledType2为 a *BaseType

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

在操场上运行它


推荐阅读