In Go è possibile dichiarare esplicitamente i nomi dei valori di ritorno nella firma della funzione. Questi valori vengono automaticamente inizializzati ai valori zero per il loro tipo. Questo è utile quando si lavora con un gran numero di variabili di ritorno, consentendo di "restituire" implicitamente i valori tramite l'operatore return (senza argomenti).
Esempio:
func foo() (x int, err error) { if someCheck() { x = 1 return // restituirà (1, nil) } return // restituirà (0, nil), se x e err non sono stati assegnati esplicitamente }
Sfumature:
nil per error). Questo può mascherare errori nella logica.Cosa verrà restituito da una funzione con risultati nominati, se all'interno non verrà eseguita alcuna assegnazione delle variabili di ritorno e viene semplicemente chiamato return?
Risposta: Verranno restituiti i loro valori zero. Ad esempio, per int — 0, per un puntatore — nil.
Esempio:
func test() (res *MyType, code int) { return // lo stesso di "return nil, 0" }
Storia
In un servizio finanziario hanno dimenticato di assegnare alla variabile err (error) un valore all'interno di una funzione con ritorni nominati. Di conseguenza, in caso di errore, la funzione restituiva nil e l'errore si perdeva. Questo ha compromesso la gestione delle transazioni e alcune operazioni sono passate inosservate.
Storia
Durante il refactoring di una funzione, è stato aggiunto un nuovo risultato di ritorno nominato, ma l'incompatibilità con il tipo di ritorno precedente non è stata notata: i test hanno trascurato il problema a causa del ritorno di un valore nullo, portando a un errore silenzioso nel deposito.
Storia
In una delle funzioni ausiliarie venivano registrati gli errori tramite il risultato nominato, ma a volte si dimenticava di gestirli non solo al ritorno ma anche nella registrazione, il che portava a bug difficili da riprodurre ("errore perso").