重新输入代码,但保留现有接口

问题描述 投票:1回答:2

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

示例代码:

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()
}

由于使用的是代码生成库,我不能只让它返回基本结构,而必须返回retyped1和retyped2。但是我还需要使用接口功能。无论如何,是否可以使用接口函数,而无需对所有接口函数进行任何愚蠢的复制和粘贴,这些接口函数除了在数百行中的if语句(例如1)以外,会做完全相同的事情?

go interface code-generation
2个回答
1
投票

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

type retyped1 struct {
  basicStruct
}

[继承basicStruct的方法,和

type retyped2 basicStruct

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

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

type retyped1 = basicStruct

1
投票

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

type basicStruct struct {
  param int
}

type derivedStruct1 struct {
  basicStruct
}

type derivedType2 basicStruct

derivedStruct1上方具有与basicStruct相同的方法,并且满足相同的接口,但是derivedType2没有任何方法。

© www.soinside.com 2019 - 2024. All rights reserved.