Tracce
/
Go
Go
/
Programma
/
Valori restituiti multipli
Va

Valori restituiti multipli in Go

{one: "1 esercizio", many: "%{count} esercizi", other: "%{count} esercizi"}

Informazioni su Valori restituiti multipli

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()

L'identificatore vuoto

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

La gestione degli errori

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

L'idioma virgola-ok

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

Valori restituiti con nome

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.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda