Valori Multipli di Ritorno

Una funzione può ritornare più valori , che sono assegnati rispettivamente alle variabili riceventi.

Esempio

(130multiple-return-values.go):

package main

import "fmt"

// Funzione che ritorna due valori interi
func vals() (int, int) {
	return 3, 7
}

func main() {

	// Invocazione di funzione con due valori
	// di ritorno
	a, b := vals()
	fmt.Println(a)
	fmt.Println(b)

	// il primo valore, come segnaposto
	_, c := vals()
	fmt.Println(c)
}

// TODO: named return parameters
// TODO: naked returns

Ritorno di errore

Per convenzione l'ultimo valore ritornato è un errore. Questo da modo di affrontare situazioni non corrette senza causare un panic a runtime.

Il Go non ha gestione eccezioni, cioè non esistono segmenti try ... catch come altri linguaggi. Seguendo la buona pratica di fornire errori nei valori di ritorno delle funzioni e di testarli nel codice chiamante si impedisce il verificarsi di situazioni altrimenti fatali.

(131-error-return.go):

package main

import "fmt"
import "errors"

func main() {
	res, err := divide(10, 0)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(res)
	}
}

func divide(x, y int) (res int, err error) {
	if y == 0 {
		return 0, errors.New("divide by zero")
	}
	return x / y, nil
}

Notare che un error è un oggetto complesso del package errors. Come tale va creato con la funzione new.

Potevamo certo decidere in questo programma di usare una stringa o un booleano, ma è sempre meglio conformarsi a features già esistenti.