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?

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.


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

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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.