У Go, чи перервається оператор перерви від перемикання / вибору?


144

Я знаю, що switch/ selectзаяви виходять з ладу автоматично після кожного випадку. Цікаво, у наступному коді:

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

Чи закінчується breakоператор із forциклу чи просто switchблоку?

Відповіді:


199

Переклади заяви, специфікація мови програмування Go.

Оператор "break" завершує виконання найпотаємнішого оператора "for", "switch" або "select".

BreakStmt = "break" [ Label ] .

Якщо є мітка, вона повинна бути такою, що додається оператором "for", "switch" або "select", і це той, виконання якого завершується (§Для виписок, §Shitch-операторів, §Select операторів).

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

Тому breakтвердження у вашому прикладі припиняє switchтвердження, "найпотужніше" твердження.


4
Який випадок використання breakвнутрішньої, select {}оскільки caseможна вибрати лише одну ?
Хуліо Гуерра

3
Тому що навіть якщо обраний окремий випадок, він може мати більш тривалу реалізацію, яка використовує перерву для припинення виконання справи, подібно до того, як ви можете повернутися з будь-якої частини функції.
Тіт Петрик

Хіба це не було б поганим дизайном? тому що переходити до операції - це погана справа, а перемикання / вибору тверджень перерваються автоматично
Джон Балвін Аріас

55

Сподіваємось наглядний приклад:

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

Так, 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.


2

це має пояснити це.

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


3
hmmm Я включив посилання go play, яке може бути корисним.
Джасмет Сінгх

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.