Повторите ввод кода, но сохраните существующий интерфейс - PullRequest
1 голос
/ 14 апреля 2020

Я хотел бы перепечатать существующий тип, но сохранить его наследование интерфейса.

так пример кода:

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

Из-за используемой библиотеки генерации кода я не могу просто чтобы он возвращал basi c struct, он должен возвращать retyped1 и retyped2. Но мне также нужно использовать функции интерфейса. Можно ли в любом случае использовать интерфейсные функции без какого-либо глупого копирования и вставки всех интерфейсных функций, которые делают то же самое, кроме как оператор 1 if в паре сотен строк?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Как указал Бурак Сердар, в golang есть 2 различных способа определения типа:

type retyped1 struct {
  basicStruct
}

, который наследует методы basicStruct, и

type retyped2 basicStruct

, который создает новая структура с теми же полями, что и basicStruct, но не с ее методами.

Для вашей конкретной ситуации вы можете использовать псевдонимы типов , что на самом деле является просто другим именем для типа, поэтому вы можете использовать повторно это методы с ним:

type retyped1 = basicStruct
1 голос
/ 14 апреля 2020

Если вам нужно определить тип на основе существующей структуры, сохраняющей его интерфейс, используйте встраивание:

type basicStruct struct {
  param int
}

type derivedStruct1 struct {
  basicStruct
}

type derivedType2 basicStruct

Выше derivedStruct1 имеет те же методы, что и basicStruct, и удовлетворяет тем же интерфейсам, но derivedType2 не имеет методов.

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