В Go, выполняется ли оператор break от коммутатора/select?

Я знаю, что операторы switch/select автоматически прерываются после каждого случая. Мне интересно, в следующем коде:

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

Вызывает ли оператор break цикл for или только блок switch?

Ответ 1

Операторы break, спецификация языка программирования Go.

Оператор "break" завершает выполнение самого внутреннего "for", "switch" или "select".

BreakStmt = "break" [ Label ] .

Если есть метка, она должна быть заключена в "для", "переключателя", или "select", и это тот, выполнение которого завершается (§ Для операторов, § Операторы переключения, §Выбрать утверждения).

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

Следовательно, оператор break в вашем примере завершает оператор switch, оператор "самой внутренней".

Ответ 2

Надеюсь, иллюстративный пример:

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

Ответ 4

Да, break разбивает внутренний 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.

Ответ 5

это должно объяснить это.

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

Работает вечно

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

Снова запускается вечно

НО

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

напечатает sjus ... ясно?

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

Ответ 6

Он только выходит из блока переключателей.

Ответ 7

Другое использование break для коммутатора в сочетании с инструкцией fallthrough. Может потребоваться некоторое творчество, чтобы правильно использовать его в правильной ситуации, но это, возможно, удобная комбинация.

Вот простой пример:

a := 25
fallThrough := true

switch {
case a > 10 :
    fmt.Println("a>10")
    if fallThrough != true {
        break
    }
    fallthrough
case a > 20:
    fmt.Println("a>20")
}