Czy w Go instrukcja break przerywa działanie przełącznika / wyboru?

144

Wiem, że switch/ selectoświadczenia łamią się automatycznie po każdej sprawie. Zastanawiam się w poniższym kodzie:

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

Czy breakinstrukcja wychodzi z forpętli, czy tylko z switchbloku?

Matt
źródło

Odpowiedzi:

199

Instrukcje Break, specyfikacja języka programowania Go.

Instrukcja „break” kończy wykonywanie najbardziej wewnętrznej instrukcji „for”, „switch” lub „select”.

BreakStmt = "break" [ Label ] .

Jeśli istnieje etykieta, musi to być ta zawierająca instrukcję „for”, „switch” lub „select”, a jest to ta, której wykonanie się kończy (instrukcje §Dla instrukcji, instrukcji przełączania, instrukcji wyboru).

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

Dlatego breakinstrukcja w przykładzie kończy switchinstrukcję, czyli instrukcję „najbardziej wewnętrzną”.

peterSO
źródło
4
Jaki jest przypadek użycia breakwewnątrz, select {}skoro casemożna wybrać tylko jeden ?
Julio Guerra
3
Ponieważ nawet jeśli zostanie wybrany pojedynczy przypadek, może mieć dłuższą implementację, która używa break do zakończenia wykonywania przypadku, podobnie jak w przypadku powrotu z dowolnego miejsca w funkcji.
Tit Petric
czy to nie byłby zły projekt? ponieważ instrukcja go to zły projekt, a instrukcje przełączania / wyboru łamią się automatycznie
John Balvin Arias
55

Mam nadzieję, że ilustrujący przykład:

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
źródło
14

Tak, breakłamie wnętrze 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
źródło
2

to powinno to wyjaśnić.

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

Działa wiecznie

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

Znowu działa wiecznie

ALE

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

wypisze sjus ... wyczyść?

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

Jasmeet Singh
źródło
3
hmmm zamieściłem link do odtwarzania, który może być pomocny.
Jasmeet Singh
0

Wychodzi tylko z bloku przełączników.

Sebastian
źródło