2014-04-28 6 views
5

Si consideri il seguente frammento di Go:Utilizzare l'idioma "comma ok" o il puntatore di ritorno?

func sheep() (int, bool) { 
    return 1, true 
} 

func main() { 
    if dolly, ok := sheep() { 
     //do something 
    } 
} 

Come ho letto su 'Effective Go' Questa è chiamata la 'virgola ok' idioma. Per quanto posso dire, questo è usato per distinguere da una cosa trovata e non trovata.

Lo stesso può essere raggiunto attraverso:

type Sheep struct {} 

func sheep() *Sheep { 
    return &Sheep{} 
} 

func main() { 
    if dolly := sheep(); dolly != nil { 
     //do something 
    } 
} 

Quest'ultimo esempio sembra svolgere lo stesso scopo, forse ancora più bello. Con l'esempio 'comma ok' l'assegnazione è valida solo nel blocco if.

Forse mi mancano alcune considerazioni. Quale modello è preferito? E perché?

Un breve esempio: http://play.golang.org/p/ATxvle38iE

+0

Il secondo esempio non è valido andare – fabrizioM

+0

Bene maculato. L'ho corretto – harm

risposta

5

In Go, un valore nil può essere un valore perfettamente buono. Ad esempio una fetta nil funziona (quasi) come una fetta vuota, e lo stesso può essere vero per i ricevitori di puntatori definiti dall'utente.

Per questo motivo, l'idioma virgola-ok o virgola è solitamente preferito perché rende ovvio che il chiamante della funzione deve trattare esplicitamente il caso dell'errore (o del non-ok).

Quindi, questi sono idiomatica quando il valore Sheep di ritorno non può essere valida:

func sheep() (*Sheep, bool) {...} 
func sheep() (s *Sheep, ok bool) {...} // Adding names to make it clearer 
func sheep() (*Sheep, error) {...} 

e questo è idiomatica solo quando il valore di ritorno è sempre valida:

func sheep() *Sheep {...} 

questa è una zona dove Go è diverso da altre lingue, dove un valore di ritorno nullo può essere usato per segnalare un errore. Gli idiomi Go di virgola-ok e virgola-errore funzionano perfettamente attorno al "miliardario errore" dei puntatori nil rendendo il codice che non si occupa di valori restituiti non validi. Se si scrive il codice idiomatico, si può immediatamente vedere quando gli errori vengono ignorati: ad esempio l'assegnazione di s2 qui salta subito fuori come sospetto:

s1 := sheep() 
s2, _ := sheep() 
6

entrambi sono accettabili, più vi siete persi l'idioma più diffuso; Restituzione value, error.

L'espressione "virgola ok" come indicato in "Effective Go" è in genere riservata alle operazioni incorporate, come la lettura da una mappa o un canale e per le asserzioni di tipo.

Lo userei se è necessario restituire un valore in cui un puntatore non sarebbe necessario, scomodo o dove nullo è un valore valido; ma a seconda della situazione, value, error potrebbe essere altrettanto buono.

+0

Perché hanno introdotto "virgola ok" oltre a "virgola err"? Sembra un'occasione mancata di coerenza, quindi credo che ci sia una buona ragione per quello. – akim

Problemi correlati