fallthrough în Go

Ultima instrucțiune dintr-un case: continuă cu ramura următoare fără să-i mai verifice condiția.

Sintaxă
switch x {
case 1:
    ...
    fallthrough   // ultima instrucțiune din ramură
case 2:
    ...
}

Ce face fallthrough

În Go, un switch execută doar ramura potrivită. fallthrough, pus ca ultimă instrucțiune într-un case, trece direct în corpul ramurii următoare, fără să-i mai verifice valoarea sau condiția.

Se folosește rar, de obicei pentru niveluri care se adună (un nivel mai mare primește și beneficiile celor de sub el). Nu poate apărea în ultima ramură a lui switch și nici într-un type switch.

Exemple

Exemplul 1: Beneficii cumulate pe niveluri

Clientul „aur” primește și beneficiile de „argint” și „bronz”, deși acele condiții nu sunt verificate.

package main

import "fmt"

func beneficii(nivel string) {
    fmt.Println("client", nivel+":")
    switch nivel {
    case "aur":
        fmt.Println("  - livrare gratuită")
        fallthrough
    case "argint":
        fmt.Println("  - reducere 10%")
        fallthrough
    case "bronz":
        fmt.Println("  - puncte de fidelitate")
    default:
        fmt.Println("  - niciun beneficiu")
    }
}

func main() {
    beneficii("aur")
    beneficii("bronz")
    beneficii("nou")
}

Rezultat

client aur:
  - livrare gratuită
  - reducere 10%
  - puncte de fidelitate
client bronz:
  - puncte de fidelitate
client nou:
  - niciun beneficiu

Exemplul 2: fallthrough ignoră condiția ramurii următoare

Deși 5 nu este mai mare decât 100, a doua ramură se execută.

package main

import "fmt"

func main() {
    n := 5
    switch {
    case n > 0:
        fmt.Println("pozitiv")
        fallthrough
    case n > 100:
        fmt.Println("ramura „n > 100” s-a executat, deși n =", n)
    }
}

Rezultat

pozitiv
ramura „n > 100” s-a executat, deși n = 5

Greșeli frecvente

  • Credința că fallthrough verifică ramura următoare: o execută necondiționat.
  • fallthrough în ultima ramură: cannot fallthrough final case in switch.
  • fallthrough în mijlocul unei ramuri sau într-un if: trebuie să fie ultima instrucțiune din case.

Comenzi înrudite

  • switch, case și default: Alege una din mai multe ramuri după valoarea unei expresii sau după prima condiție adevărată.
  • type switch: Un switch care alege ramura după tipul concret ținut de o interfață, cu variabila deja convertită.