Funzioni
Le funzioni sono blocchi di istruzioni.
Le funzioni possono o no ricevere parametri all'atto del lancio, e ritornano o no uno o più valori.
Una funzione ha una segnatura, determinata dalla lista dei tipi di parametri e dal tipo di ritorno.
Le funzioni sono solo definite, non dichiarate (eccezione: all'interno di interfacce).
Una funzione può essere definita ovunque nel package che la contiene, non necessariammente prima del suo uso.
Le funzioni non nel package corrente devono avere il nome prefissato dal nome del package e da un punto, come in fmt.Println
, e il package deve essere importato.
Esempio
(120functions.go):
package main
import "fmt"
func main() {
// Invocazione di funzione
// con i parametri attuali
res := plus(1, 2)
fmt.Println("1+2 =", res)
res = plusPlus(1, 2, 3)
fmt.Println("1+2+3 =", res)
}
// Non possono esistere due funzioni con lo stesso
// nome nello stesso package
// Una funzione è risolta ovunque nel package
// Non occorre dichiararla prima di invocarla
// se l'intero package è compilato insieme
// Tutti i parametri hanno un tipo a seguire
// ed è indicato il tipo del valore di ritorno
// Si chiamano parametri formali e sono locali
func plus(a int, b int) int {
// Il return deve essere esplicito
return a + b
}
// Più parametri dello stesso tipo possono essere aggregati
func plusPlus(a, b, c int) int {
return a + b + c
}
I parametri sono posizionali, cioè vanno passati al momento dell'invocazione nello stesso ordine in cui sono stati definiti.
Non tutti i parametri devono essere passati all'atto dell'invocazione, gli ultimi possono esser opzionali, ma non è possibile settare parametri di default, come in:
// Codice errato
func drawline(x1, y1, x2, y2 int, thickness int = 1, dashed bool){
...
}
In questo esempio si può omettere dashed
e il default è false
. Si può anche omettere thickness
, e il default è 0
.
Se si vuole indicare dashed
, occorre passare anche thickness
.
Se una funzione è definita come ritornante un valore, il return
con tale valore è obbligatorio.
Se una funzione non ritorna un valore, il return
non deve avere valore. Se il return
manca, avviene automaticamente alla fine del blocco di istruzioni.
Non si possono avere parametri formali nella definizione della funzione, che non siano poi utilizzati.
Se un parametro formale è dichiarato, deve esserci nel codice qualche invocazione della funzione che passa il relativo parameto attuale.