No Go, uma declaração de interrupção é interrompida em um switch / select?

144

Eu sei que switch/ selectdeclarações quebram automaticamente após cada caso. Gostaria de saber, no seguinte código:

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

A breakinstrução sai do forloop ou apenas do switchbloco?

Matt
fonte

Respostas:

199

Instruções de quebra, The Go Programming Language Specification.

Uma instrução "break" finaliza a execução da instrução "for", "switch" ou "select" mais interna.

BreakStmt = "break" [ Label ] .

Se houver um rótulo, deve ser o de uma instrução "for", "switch" ou "select" anexada, e essa é a cuja execução termina (§For declarações, §Switch declarações, §Selecionar instruções).

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

Portanto, a breakinstrução no seu exemplo finaliza a switchinstrução, a instrução "mais interna".

peterSO
fonte
4
O que é o caso de uso do breakinterior select {}já que apenas um casepode ser selecionado?
Julio Guerra
3
Como, mesmo que um único caso seja selecionado, ele pode ter uma implementação mais longa que usa interrupção para finalizar a execução do caso, assim como você pode retornar de qualquer lugar em uma função.
precisa saber é o seguinte
isso não seria um desing ruim? porque ir para declaração é um desing ruim, e alternar / selecionar declarações quebrar automaticamente
John Balvin Arias
55

Um exemplo esperançosamente ilustrativo:

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
fonte
14

Sim, breakquebra o interior 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
fonte
8

Apenas a partir de um bloco de interruptores. Existem muitos exemplos no código do Golang que você pode examinar (compare a quebra interna com a quebra externa ).

raina77ow
fonte
2

isso deve explicar isso.

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

Corre para sempre

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

Mais uma vez, corre para sempre

MAS

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

vai imprimir sjus ... claro?

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

Jasmeet Singh
fonte
3
hmmm eu incluí um link go play, o que pode ser útil.
Jasmeet Singh
0

Sai apenas do bloco do interruptor.

Sebastian
fonte