🎯 1. Mehrfache Rückgabewerte (Multiple Return Values)
In Go können Funktionen mehrere Werte zurückgeben. Das ist die fundamentale Grundlage für das Go-Fehlerbehandlungsmodell:
import "errors"
func SichereDivision(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("Division durch Null nicht erlaubt")
}
return a / b, nil
}
// Aufruf mit Entpacken:
ergebnis, err := SichereDivision(10, 2)
if err != nil {
fmt.Println("Fehler:", err)
return
}
fmt.Println("Ergebnis:", ergebnis)
In vielen Sprachen wirft eine Funktion im Fehlerfall ein Paket über den Zaun (Exception), und du musst hoffen, dass jemand einen Fanghandschuh (Try-Catch) anhat. In Go übergibt dir der Bote immer zwei Dinge direkt in die Hand: Das Paket (Ergebnis) und die unterschriebene Quittung (Error). Ist die Quittung nil, ist alles perfekt!
📋 2. Benannte Rückgabewerte & Variadische Parameter
Rückgabewerte können im Funktionskopf benannt werden. Sie werden wie lokale Variablen initialisiert:
// Benannte Rückgabewerte dokumentieren den Zweck sofort:
func BerechneStatistik(werte []int) (min int, max int, summe int, schnitt float64) {
if len(werte) == 0 {
return 0, 0, 0, 0.0
}
// min, max, summe werden berechnet...
return min, max, summe, schnitt
}
// Variadische Funktion: Akzeptiert beliebig viele Argumente
func LoggeEreignisse(level string, nachrichten ...string) {
for _, msg := range nachrichten {
fmt.Printf("[%s] %s\n", level, msg)
}
}
🔒 3. Anonyme Funktionen & Closures
Funktionen sind in Go Werte (First-Class Citizens). Sie können Variablen aus ihrem äußeren Gültigkeitsbereich einschließen (Closure):
func ErstelleZaehler(start int) func() int {
zaehler := start
return func() int {
zaehler++
return zaehler
}
}
c1 := ErstelleZaehler(10)
fmt.Println(c1()) // 11
fmt.Println(c1()) // 12