ProgrammazioneSenior Go Developer

Come funzionano i valori di ritorno nominati in Go? Quali sono i vantaggi e i pericoli associati al loro utilizzo e quali sono le caratteristiche dei valori zero in questo contesto?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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:

  • Se si dimentica di assegnare esplicitamente l'errore alla variabile, verrà restituito il suo valore zero (di solito nil per error). Questo può mascherare errori nella logica.
  • I valori zero per i risultati nominati vengono utilizzati per l'inizializzazione e la restituzione predefinita.
  • Utilizzare risultati nominati con cautela: aumentano la leggibilità solo nei casi in cui il ritorno dalla funzione ha un significato inequivocabile.

Domanda insidiosa

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" }

Esempi di errori reali


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").