Switch-Anweisungen

Eine besondere Form der Fallunterscheidungen (if/else) sind die switch-Anweisungen:

package main

import "fmt"

func main() {
    zahl := 5
    switch {
    case zahl < 5:
        fmt.Println("Zahl ist kleiner als 5")
    case zahl < 10:
        fmt.Println("Zahl ist kleiner als 10")
    case zahl < 20:
        fmt.Println("Zahl ist kleiner als 20")
    }
}

Probier' es aus! Welche Texte erscheinen, wenn du das Programm startest? Hier funktioniert switch im Prinzip wie die Fallunterscheidung oben, es werden die Fälle von oben nach unten durchgegangen, der erste der Zutrifft wird ausgeführt.

Die erste Zeile kann wie in der if-Anweisung auch mit einem einfachen Ausdruck geschrieben werden:

package main

import "fmt"

func leseZahl() int {
    return 5
}

func main() {
    switch zahl := leseZahl(); {
    case zahl < 5:
        fmt.Println("Zahl ist kleiner als 5")
    default:
        fmt.Println("Zahl ist größer oder gleich 5")
    }
}

Wichtig ist das Semikolon bei dieser Form in der ersten Zeile der switch-Anweisung. Es ist die Kurzform für

switch zahl := leseZahl(); true {

was bedeutet, dass der erste Fall, der true ergibt, ausgeführt werden soll. Stünde hier false, würde der erste Fall, der false ergibt, ausgeführt werden.

Im Beispiel gibt es noch eine Besonderheit, den default-Fall. Wenn keine der Fälle, die unter case abgefragt werden zutreffen, wird nach einem default-Fall gesucht und ggf. ausgeführt.

Es gibt noch mit der fallthrough die Möglichkeit, mehrere Fälle zu überprüfen:

package main

import "fmt"

func main() {
    switch zahl := 5; {
    case zahl < 5:
        fmt.Println("Zahl ist kleiner als 5")
        fallthrough
    case zahl < 10:
        fmt.Println("Zahl ist kleiner als 10")
        fallthrough
    case zahl < 20:
        fmt.Println("Zahl ist kleiner als 20")
    }
}

Was ist der Unterschied zum ersten Beispiel aus diesem Abschnitt? Welche Ausgaben erscheinen, wenn du das Programm laufen lässt? Die Anweisung fallthrough darf als letzte Anweisung in allen bis auf dem letzten Fall vorkommen und bedeutet soviel wie »mache weiter, als ob nichts gewesen wäre«. Wenn ein Fall ausgeführt wird und am Ende fallthrough steht, bricht die Verarbeitung nicht ab, sondern es werden weiter Fälle überprüft.

Wie im Abschnitt über Schleifen erwähnt, kann man mit break auch eine Switch-Anweisung beenden. Erreicht das Programm eine solche Anweisung, wird es an der Stelle ausgeführt, an der die switch Anweisung die schließende Klammer hat.