Dans Go, une instruction break s'interrompt-elle d'un commutateur / select?

144

Je sais que switch/ les selectdéclarations se cassent automatiquement après chaque cas. Je me demande, dans le code suivant:

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

L' breakinstruction quitte- t-elle la forboucle ou juste le switchbloc?

Mat
la source

Réponses:

199

Instructions de rupture, spécification du langage de programmation Go.

Une instruction "break" met fin à l'exécution de l'instruction "for", "switch" ou "select" la plus interne.

BreakStmt = "break" [ Label ] .

S'il y a une étiquette, elle doit être celle d'une instruction englobante «for», «switch» ou «select», et c'est celle dont l'exécution se termine (§Pour les instructions, §Switch, §Select).

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

Par conséquent, l' breakinstruction de votre exemple met fin à l' switchinstruction, l'instruction "la plus interne".

peterSO
la source
4
Quel est le cas d'utilisation de l' breakintérieur select {}puisqu'une seule casepeut être sélectionnée?
Julio Guerra
3
Parce que même si un seul cas est sélectionné, il peut avoir une implémentation plus longue qui utilise break pour terminer l'exécution du cas, un peu comme vous pouvez retourner de n'importe où dans une fonction.
Tit Petric
ne serait-ce pas une mauvaise desing? parce que l'instruction go to est une mauvaise desing, et les instructions switch / select se cassent automatiquement
John Balvin Arias
55

Un exemple illustratif, espérons-le:

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
la source
14

Oui, breakbrise l'intérieur 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
la source
8

Juste à partir d'un bloc de commutation. Il y a beaucoup d'exemples dans le code de Golang que vous pouvez examiner (comparez la rupture interne avec la rupture externe ).

raina77ow
la source
2

cela devrait l'expliquer.

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

Fonctionne pour toujours

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

Encore une fois, court pour toujours

MAIS

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

imprimera sjus ... clair?

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

Jasmeet Singh
la source
3
hmmm j'ai inclus un lien go play, qui pourrait être utile.
Jasmeet Singh
0

Il sort uniquement du bloc de commutation.

Sébastien
la source