switch 语句中falltrough 的行为

我正在阅读本书中关于 Go 中 switch 语句的部分。但是这个例子让我感到困惑:


 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

并且书中指出:


使用 fallthrough 语句来指示必须执行当前块之后的 case 块。


现在我要提问:


为什么 Go 默认比较,在这种情况下 k 较低?

文中提到执行以下情况。美好的。但是为什么他们不只执行与 k 匹配的案例?


FFIVE
浏览 520回答 1
1回答

烙印99

在表达式 switch 中,对 switch 表达式求值,而不必为常量的 case 表达式从左到右和从上到下求值;第一个等于 switch 表达式的语句触发相关 case 语句的执行;其他情况被跳过。如果没有 case 匹配并且存在“默认” case,则执行其语句。最多可以有一个默认情况,它可能出现在“switch”语句中的任何位置。缺少 switch 表达式等效于布尔值 true。ExprSwitchStmt = "switch" [ SimpleStmt ";" ] [ Expression ] "{" { ExprCaseClause } "}" .ExprCaseClause = ExprSwitchCase ":" StatementList .ExprSwitchCase = "case" ExpressionList | "default" .在 case 或 default 子句中,最后一个非空语句可能是(可能标记为)“fallthrough”语句,以指示控制应从该子句的末尾流向下一个子句的第一个语句。否则控制流到“switch”语句的末尾。“fallthrough”语句可能作为表达式 switch 的最后一个子句以外的所有语句的最后一个语句出现。表达式前面可能有一个简单的语句,该语句在计算表达式之前执行。从上到下评估 case 表达式。case 4并且case 5是false,case 6是true。case 7,case 8和default是false但流入通过下一级条款执行fallthrough。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go