2015-06-27 32 views
-1

我正在閱讀關於Go中switch語句的this book部分。但這個例子讓我感到困惑:switch語句中falltrough的行爲

package main 

import "fmt" 

func main() { 
k := 6 
switch k { 
    case 4: fmt.Println("was <= 4"); fallthrough; 
    case 5: fmt.Println("was <= 5"); fallthrough; 
    case 6: fmt.Println("was <= 6"); fallthrough; 
    case 7: fmt.Println("was <= 7"); fallthrough; 
    case 8: fmt.Println("was <= 8"); fallthrough; 
    default: fmt.Println("default case") 
    } 
} 

輸出是:

was <= 6 
was <= 7 
was <= 8 
default case 

而且書中指出:

使用下通聲明,表明以下的情況下塊的當前必須執行。

現在我要提問:

  1. 爲什麼Go默認比較,在這種情況下,k是低?
  2. 該文字提到執行以下情況。精細。但爲什麼他們不是隻執行案例匹配k?

回答

2

The Go Programming Language Specification

Switch statements

表達切換

在表達開關,開關表達式求值和 情況下的表達式,它不必是常數,被評估 左從右到上和從上到下;第一個等於開關 表達式觸發執行關聯的 大小寫的語句;其他情況會被跳過。如果沒有大小寫匹配並且存在 「默認」情況,則執行其語句。最多隻能有一個 默認情況,它可能出現在「switch」語句的任何地方。 A 缺少的開關表達式等同於布爾值true。

ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" . 
ExprCaseClause = ExprSwitchCase ":" StatementList . 
ExprSwitchCase = "case" ExpressionList | "default" . 

在的情況下,或默認條款,最後的非空語句可以是 (可能標記的)「下通」語句,以指示控制 應該從這個子句的端部流向的第一個語句接下來的條款是 。否則控制流向「開關」 聲明的末尾。 「fallthrough」語句可能會顯示爲表達式切換的最後一個子句的最後一個語句 。

表達式前面可能有一個簡單的語句,它在計算表達式之前執行 。

從上到下評估案例表達式。 case 4case 5false,case 6truecase 7,case 8defaultfalse,但通過fallthrough流向下一個子句執行。

+0

感謝您的報價。然後,我首先明白了'穿越'問題。在[this](https://play.golang。org/p/aZg0Qv8Ull)代碼示例我創建了一個簡單的場景,每個人都應該猜測整數。愛麗絲和丹都是對的。如果沒有「fallthrough」,腳本只會將Alice打印爲贏家,而Bob的情況不會被檢查。我預計,'fallthrough'會搜索其他匹配項,並只執行那些而不是全部。有沒有辦法在不使用for循環的情況下在switch語句中找到多個匹配項? – user3147268

+0

@ user3147268:否。但是,'switch'語句是'if'語句的特殊限定形式。使用'if'語句,例如https://play.golang.org/p/l7NIEdP_Ic – peterSO

+0

具有諷刺意味的是,爲什麼程序員爲了避免if-else混亂而使用switch,是因爲這個原因。 – user3147268