2012-04-03 6 views
9

Sto inviando una risposta a una richiesta su un chan X, dove X è una struttura. La richiesta è un'operazione di ricerca, quindi idealmente mi piacerebbe poter restituire uno X o segnalare che non è stato trovato.C'è un bel modo per simulare un tipo "Forse" o "opzione" in Vai?

Questo sarebbe un compito per un Maybe X in Haskell o un x option in OCaml. C'è un modo decente per farlo in Go? Non sto restituendo un puntatore (dato che l'oggetto originale che sto restituendo potrebbe essere modificato in seguito), quindi non posso semplicemente restituire nil.

Edit: in questo momento sto facendo un chan interface{} e sia l'invio di un X o nil, ma questo è brutto e sconfigge tipo di sicurezza.

+0

in https://github.com/alphazero/future.go ho optato per la tupla (interfaccia {}, bandiera) come il carico utile del canale. Abbastanza interessante, lo ha spinto ieri. – alphazero

risposta

2

Se si utilizza interface {} si sta effettivamente restituendo un puntatore ora. Perché non modificare interface {} a *X e assicurarsi di restituire una copia dell'oggetto? Se capisco il tuo ragionamento dietro non usare uno chan *X, cioè.

+0

Uhh, sì, lo fai. Suppongo che sia un'opzione. Il modo più economico/più semplice per farlo è chiamare '& * object'? (se è permesso (controllerò)) – Ashe

+0

I due modi in cui posso pensare senza usare il pacchetto 'reflect' sono' a: = b; return & a' and 'return & thistype {thisfield: b.thisfield, thisotherfield: b.thisotherfield}'. Non ho benchmark, ma il primo usa meno istruzioni. – mkb

+0

Sicuramente utilizza meno codice, ed è meno di un problema di manutenzione, quindi vado con quello. Saluti! – Ashe

3

Un altro modo sarebbe aggiungere un ok bool. Si potrebbe o aggiungerlo al X o avvolgere X, come struct {X; ok bool}

5

uso il tipo di puntatore, dove:

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

Recentemente ho avuto bisogno di rappresentare un opzionale/forse di un tipo re non volevo usare un puntatore e non potevo contare sul valore zero. Ho finito per optare per scrivere il sotto, che avvolgerà qualsiasi tipo per te. Potrebbe anche adattarsi al tuo caso d'uso.

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

Problemi correlati