2012-06-19 32 views
75

我知道switch/select報表每個案例後自動斷線。我想知道,下面的代碼:在Go中,斷開語句是否與switch/select斷開?

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

是否break聲明退出for循環或只是switch塊?

回答

110

Break statements, The Go Programming Language Specification.

「中斷」 語句終止最內層的 「for」, 「開關」 或執行 「select」 語句。

BreakStmt = "break" [ Label ] . 

如果有一個標籤,它必須是「換」,「開關」 或一個封閉的「選擇」的聲明,那就是它的執行終止 (§For陳述,§Switch一報表,選擇報表)。

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

因此,在您的示例break語句終止switch聲明中, 「最內層」 的聲明。

+1

'select {}'中'break'的用例是什麼,因爲只能選擇一個'case'? –

+1

因爲即使選擇了一個案例,它也可能有一個更長的實現,它使用break來終止案例的執行,就像你可以從函數的任何地方返回一樣。 –

6

只是從一個開關塊。 Golang自己的代碼中有很多可以檢查的例子(比較inner breakouter break)。

+0

都被斷開的鏈接 –

+0

@lukewendling固定的,謝謝你注意到,。 – raina77ow

30

甲希望說明性示例:

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

我相信這行代碼:break loop //像'goto B' – Jerred

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

+0

你的答案只是複製/粘貼以前的答案... – Arkan

+3

嗯我包括一個去玩的鏈接,這可能會有所幫助。 –

+0

我喜歡最後的表達...清楚嗎? –

3

是,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. 
0

另一個用途爲開關破與下通語句組合。它可能需要一定的創造力才能在正確的情況下正確使用它,但它可能是一個可用的組合。

下面是簡單的例子:

a := 25 
fallThrough := true 

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