重新输入代码但保留现有界面

Retype code but retain existing interface

我想重新键入现有类型但保留其接口继承。

所以示例代码:

interface interface1 {
  func interfaceFunc1()
}

type basicStruct struct {
  param int
}

type retyped1 basicStruct
type retyped2 basicStruct

func (basicStruct) interfaceFunc1() {
  // does stuff
}

func getTyped1() retyped1 {
  return basicStruct{param:0}
}

func getTyped2() retyped2 {
  return basicStruct{param:1}
}

func main() {
  type1 := getTyped1()
  type2 := getTyped2()

  // These lines do not compile
  type1.interfaceFunc1()
  type2.interfaceFunc1()
}

由于我正在使用代码生成库,我不能只使用它 return 基本结构,它必须 return 重新键入 1 和重新键入 2。 但是我还需要使用接口函数。 无论如何使用接口函数而不需要对所有接口函数进行一些愚蠢的复制和粘贴,这些接口函数做完全相同的事情,除了几百行中的 1 个 if 语句?

如果您需要基于保留其接口的现有结构定义类型,请使用嵌入:

type basicStruct struct {
  param int
}

type derivedStruct1 struct {
  basicStruct
}

type derivedType2 basicStruct

以上derivedStruct1basicStruct有相同的方法,满足相同的接口,但derivedType2没有任何方法。

正如 Burak Serdar 指出的那样,在 golang 中有两种不同的方式来定义类型:

type retyped1 struct {
  basicStruct
}

继承了basicStruct

的方法
type retyped2 basicStruct

创建具有与 basicStruct 相同字段的新结构,但不是它的方法。

对于您的特定情况,您可以使用 type aliases,它实际上只是类型的另一个名称,因此您可以重复使用它的方法:

type retyped1 = basicStruct