switch
/select
ステートメントは、すべての場合に自動的に壊れることを知っています。私は次のコードで疑問に思っています:
for {
switch sometest() {
case 0:
dosomething()
case 1:
break
default:
dosomethingelse()
}
}
break
ステートメントはfor
ループを終了しますか、それともswitch
ブロックのみを終了しますか?
「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
ステートメントを終了します。
うまくいけば説明的な例:
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()
// ....
はい、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.
これで説明できるはずです。
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を印刷します...クリア?
Switchのbreakのもう1つの用途は、フォールスルーステートメントとの組み合わせです。正しい状況で適切に使用するには、ある程度の創造性が必要な場合がありますが、使用可能な組み合わせである可能性があります。
以下に簡単な例を示します。
a := 25
fallThrough := true
switch {
case a > 10 :
fmt.Println("a>10")
if fallThrough != true {
break
}
fallthrough
case a > 20:
fmt.Println("a>20")
}
スイッチブロックを終了するだけです。