2012-04-03 19 views
9

Wysyłam odpowiedź na żądanie przez chan X, gdzie X jest strukturą. Żądanie jest operacją wyszukiwania, więc najlepiej byłoby móc zwrócić wartość X lub zgłosić, że nie została znaleziona.Czy istnieje dobry sposób symulacji typu "Może" lub "opcja" w programie Go?

To byłoby zadanie dla Maybe X w Haskell lub x option w OCaml. Czy jest jakiś przyzwoity sposób to zrobić w Go? Nie zwracam wskaźnika (ponieważ oryginalny obiekt, który zwracam, może zostać zmodyfikowany później), więc nie mogę po prostu zwrócić nil.

Edit: teraz robię mu chan interface{} i albo wysyłając X lub nil, ale jest brzydki i pokonuje wpisać-bezpieczeństwo.

+0

w https://github.com/alphazero/future.go I zdecydował się krotki (interfejsu {} flaga) jako danych kanału. Interesujące, popchnęło to wczoraj. – alphazero

Odpowiedz

2

Jeśli używasz interface {}, efektywnie zwracasz teraz wskaźnik. Dlaczego nie zmienić interface {} na i upewnić się, że zwrócisz kopię obiektu? Jeśli rozumiem twoje rozumowanie za niestosowaniem numeru chan *X.

+0

Uhh, tak, robisz. Przypuszczam, że jest to opcja. Czy jest to najtańszy/najłatwiejszy sposób, aby to nazwać '& * object'? (jeśli to jest nawet dozwolone (sprawdzę.)) – Ashe

+0

Dwa sposoby, jakie mogę wymyślić bez użycia pakietu 'reflect' to' a: = b; return & a' i 'return & thistype {thisfield: b.thisfield, thisotherfield: b.thisotherfield}'. Nie testowałem, ale ten pierwszy używa mniej instrukcji. – mkb

+0

Z pewnością używa mniej kodu i jest mniej problemem związanym z konserwacją, więc pójdę z tym. Twoje zdrowie! – Ashe

3

Innym sposobem byłoby dodać ok bool. Można też dodać go do X lub owinąć X, jak struct {X; ok bool}

5

używam typ wskaźnika, gdzie:

  • Maybe X = *X
  • Nothing = nil
  • Just x = &x
1

Niedawno musiałem reprezentować opcjonalne/może tego typu ponownie nie chciałem używać wskaźnika i nie mogłem polegać na wartości zerowej. Skończyło się na tym, że napiszę poniżej, który będzie dla Ciebie zawijany. To może również pasować do twojego przypadku użycia.

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

Powiązane problemy