Le funzioni e i metodi in Go possono restituire più valori:
func GetCard() (Card, error) { ... }
Ogni valore restituito deve essere assegnato nell'ordine corretto e separato da virgole:
card, err := GetCard()
Ogni posizione nell'assegnazione dichiara una variabile.
In Go non è consentito dichiarare una variabile senza usarla.
Usa l'identificatore vuoto _ al posto di un nome di variabile per saltare quel valore restituito.
card, _ := GetCard() // error intentionally ignored
_, err := GetCard() // card ignored, only checking for error
error è un'interfaccia predefinita.
Un errore nil significa che non si è verificato alcun errore; qualsiasi valore diverso da nil significa che qualcosa è andato storto.
Per convenzione, le funzioni che possono fallire dovrebbero restituire un error come ultimo valore.
Chi chiama la funzione deve controllarlo prima di usare qualsiasi altro valore restituito:
card, err := GetCard()
if err != nil {
// unsafe to use card here
return err
}
// safe to use card here
Lo schema di assegnazione a due valori compare anche quando non si gestisce un error.
Anche la ricerca in una map, l'asserzione di tipo e la ricezione da un channel usano un secondo valore booleano, etichettato ok per convenzione, per indicare un esito positivo o la presenza di dati:
m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"] // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int) // ok is false
v, ok := <-ch // ok is false if ch is closed and empty
I valori restituiti possono anche avere un nome nella firma della funzione. Queste variabili sono poi accessibili all'interno del corpo.
func divide(a, b int) (quotient, remainder int) {
quotient = a / b
remainder = a % b
return quotient, remainder
}
I valori restituiti con nome documentano il significato di ogni posizione di ritorno. Possono anche essere usati con un return nudo, scritto senza valori. I return nudi restituiscono implicitamente i valori attuali delle variabili con nome:
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
Nelle funzioni più lunghe, i return nudi spesso danneggiano la leggibilità, perché non è chiaro cosa venga restituito. Preferisci i valori restituiti espliciti, a meno che la funzione non sia abbastanza breve da tenere sempre sott'occhio la firma.
Per saperne di più, dai un'occhiata a Go by Example: Multiple Return Values, Effective Go: Multiple Returns o al Tour of Go.