Bricht in Go eine break-Anweisung von einem Schalter / einer Auswahl ab?

143

Ich weiß, dass switch/ selectAnweisungen nach jedem Fall automatisch unterbrochen werden. Ich frage mich, im folgenden Code:

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

Verlässt die breakAnweisung die forSchleife oder nur den switchBlock?

Matt
quelle

Antworten:

198

Break-Anweisungen, The Go Programming Language Specification.

Eine "break" -Anweisung beendet die Ausführung der innersten "for" -, "switch" - oder "select" -Anweisung.

BreakStmt = "break" [ Label ] .

Wenn es eine Bezeichnung gibt, muss es sich um eine umschließende "for" -, "switch" - oder "select" -Anweisung handeln, und diese ist diejenige, deren Ausführung endet (§For-Anweisungen, §Switch-Anweisungen, §Select-Anweisungen).

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

Daher beendet die breakAnweisung in Ihrem Beispiel die switchAnweisung, die "innerste" Anweisung.

peterSO
quelle
4
Was ist der Anwendungsfall des breakInneren, select {}da nur einer caseausgewählt werden kann?
Julio Guerra
3
Denn selbst wenn ein einzelner Fall ausgewählt ist, kann es zu einer längeren Implementierung kommen, bei der break verwendet wird, um die Ausführung des Falls zu beenden, ähnlich wie Sie von einer beliebigen Stelle in einer Funktion zurückkehren können.
Tit Petric
Wäre das nicht eine schlechte Sache? weil go to Anweisung ein schlechtes Design ist und switch / select-Anweisungen automatisch unterbrochen werden
John Balvin Arias
55

Ein hoffentlich anschauliches Beispiel:

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()
// ....
zzzz
quelle
14

Ja, breakbricht das Innere 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.
anatoly techtonik
quelle
8

Nur aus einem Schalterblock. Es gibt viele Beispiele in Golangs eigenem Code, die Sie untersuchen können (vergleichen Sie den inneren Bruch mit dem äußeren Bruch ).

raina77ow
quelle
2

das sollte es erklären.

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

Läuft für immer

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

Wieder läuft für immer

ABER

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")
    }
}
}

wird sjus drucken ... klar?

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

Jasmeet Singh
quelle
3
hmmm ich habe einen Go-Play-Link eingefügt, der hilfreich sein könnte.
Jasmeet Singh
0

Es verlässt nur den Schaltblock.

Sebastian
quelle