Идиоматический способ представления одного из / union в Go - PullRequest
0 голосов
/ 09 мая 2019

Я стремлюсь реализовать структуру, которая может быть либо Foo, либо Bar.

Итак, сейчас у меня есть:

type Foo struct{}
type Bar struct{} 

// This is the end version consumed by my package
type Baz struct {
  Foo Foo `json:"foo,omitempty"`
  Bar Bar `json:"bar,omitempty"`
  // ... there are different members here
}

Тогда в моих внутренних функциях мне нужнопроверьте, содержит ли Baz Foo или Bar, и обработайте их по-разному.

Есть ли идиоматический способ справиться с этим?Прямо сейчас я проверяю, являются ли члены Foo значениями по умолчанию, но это кажется хакерским.

Я подумал о том, чтобы сделать указатели членов таким образом, чтобы они могли быть обнуляемыми, и тогда я смогу проверить их на ноль.

Я что-то здесь упускаю?

1 Ответ

4 голосов
/ 09 мая 2019

Вы ищете алгебраические типы данных . Идея состоит в том, чтобы определить интерфейс, реализуемый вашими «разными типами», и сохранить этот интерфейс там, где они ожидаются.

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