Есть ли хороший способ для имитации типа "Возможно" или "вариант" в Go? - PullRequest
12 голосов
/ 03 апреля 2012

Я отправляю ответ на запрос через chan X, где X - это структура.Запрос является операцией поиска, поэтому в идеале я хотел бы иметь возможность вернуть либо X, либо сообщить, что он не найден.

Это было бы задачей для Maybe X в Haskell.или x option в OCaml.Есть ли достойный способ сделать это в Go?Я не возвращаю указатель (так как исходный объект, который я возвращаю, может быть изменен позже), поэтому я не могу просто вернуть nil.

Редактировать: прямо сейчас яЯ делаю это chan interface{} и отправляю X или nil, но это уродливо и наносит ущерб безопасности типов.

Ответы [ 4 ]

8 голосов
/ 10 января 2016

Я использую тип указателя, где:

  • Maybe X = *X
  • Nothing = nil
  • Just x = &x
3 голосов
/ 04 апреля 2012

Другим способом было бы добавить ok bool.Вы можете добавить его в X или обернуть X, например struct {X; ok bool}

3 голосов
/ 03 апреля 2012

Если вы используете interface {}, вы фактически возвращаете указатель.Почему бы не изменить interface {} на *X и обязательно вернуть копию объекта?Если я понимаю ваши аргументы в пользу не использования chan *X, то есть.

2 голосов
/ 14 апреля 2017

Мне недавно нужно было представить необязательный / может быть тип, в котором я не хотел использовать указатель и не мог полагаться на нулевое значение. В итоге я решил написать ниже, что обернет любой тип для вас. Это также может соответствовать вашему варианту использования.

https://github.com/leighmcculloch/go-optional

...