Goでは、breakステートメントはswitch / selectからブレークしますか?


144

switch/ select文はすべてのケースの後で自動的に壊れることを知っています。私は次のコードで疑問に思っています:

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

breakステートメントは終了forループまたは単にswitchブロックを?

回答:


199

Breakステートメント、Goプログラミング言語仕様。

「break」ステートメントは、最も内側の「for」、「switch」、または「select」ステートメントの実行を終了します。

BreakStmt = "break" [ Label ] .

ラベルがある場合は、それを囲む「for」、「switch」、または「select」ステートメントのラベルである必要があり、それは実行が終了するものです(§Forステートメント、§Switchステートメント、§Selectステートメント)。

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

したがって、break例のswitchステートメントは、ステートメント、「最も内側の」ステートメントを終了します。


4
1 つしか選択できないので、breakwithinの使用例は何ですか?select {}case
Julio Guerra 2017年

3
単一のケースが選択されている場合でも、関数の任意の場所から戻ることができるように、breakを使用してケースの実行を終了するより長い実装がある可能性があります。
Tit Petric 2017

それは悪い設計ではないでしょうか?go toステートメントは悪い設計であり、switch / selectステートメントは自動的に壊れます
John Balvin Arias

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
うーん、役立つプレイリンクを含めました。
Jasmeet Singh 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.