In Go, un'istruzione break si interrompe da uno switch / select?


144

So che le dichiarazioni switch/ si selectinterrompono automaticamente dopo ogni caso. Mi chiedo, nel seguente codice:

for {
    switch sometest() {
    case 0:
        dosomething()
    case 1:
        break
    default:
        dosomethingelse()
    }
}

L' breakistruzione esce dal forciclo o solo dal switchblocco?

Risposte:


199

Dichiarazioni di break, The Go Programming Language Specification.

Un'istruzione "break" termina l'esecuzione dell'istruzione "for", "switch" o "select" più interna.

BreakStmt = "break" [ Label ] .

Se esiste un'etichetta, deve essere quella di un'istruzione "for", "switch" o "select" racchiusa, e quella è quella la cui esecuzione termina (§Per istruzioni, §Switch istruzioni, §Seleziona istruzioni).

L:
  for i < n {
      switch i {
      case 5:
          break L
      }
  }

Pertanto, l' breakistruzione nel tuo esempio termina l' switchistruzione, l'istruzione "più interna".


4
Qual è il caso d'uso del breakraggio select {}dal momento che solo uno casepuò essere selezionato?
Julio Guerra,

3
Perché anche se viene selezionato un singolo caso, potrebbe avere un'implementazione più lunga che utilizza l'interruzione per terminare l'esecuzione del caso, proprio come è possibile tornare da qualsiasi punto di una funzione.
Tit Petric,

non sarebbe un brutto desing? perché go to statement è un cattivo desing e switch / select si interrompono automaticamente
John Balvin Arias

55

Un esempio speranzoso illustrativo:

loop:
for {
        switch expr {
        case foo:
                if condA {
                        doA()
                        break // like 'goto A'
                }

                if condB {
                        doB()
                        break loop // like 'goto B'                        
                }

                doC()
        case bar:
                // ...
        }
A:
        doX()
        // ...
}

B:
doY()
// ....

14

Sì, breakrompe l'interno switch.

https://play.golang.org/p/SZdDuVjic4

package main

import "fmt"

func main() {

    myloop:for x := 0; x < 7; x++ {
        fmt.Printf("%d", x)
        switch {
        case x == 1:
            fmt.Println("start")
        case x == 5:
            fmt.Println("stop")
            break myloop
        case x > 2:
            fmt.Println("crunching..")
            break
        default:
            fmt.Println("idling..")
        }
    }
}
0idling..
1start
2idling..
3crunching..
4crunching..
5stop

Program exited.


2

questo dovrebbe spiegarlo.

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

Funziona per sempre

for{
    x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

Ancora una volta, corre per sempre

MA

package main

import "fmt"

func main() {
d:
for{
x := 1
    switch {
    case x >0:
        fmt.Println("sjus")
        break d
    case x == 1:
        fmt.Println("GFVjk")
    default:
        fmt.Println("daslkjh")
    }
}
}

stamperà sjus ... cancella?

http://play.golang.org/p/GOvnfI67ih


3
hmmm ho incluso un link go play, che potrebbe essere utile.
Jasmeet Singh,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.