[译] part 10: golang switch 语句

https://juejin.im/post/5cbafde3f265da0369029492

switch是一个条件语句,它计算表达式并将其和可能的结果进行匹配,根据匹配执行代码块。它常用来替代多个 if else 子句。

光说不练假把式,让我们从一个简单的例子开始,该例子将手指号作为输入并输出该手指的名称:)。例如 1 是拇指,2 是无名指,依此类推。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. finger := 4
  7. switch finger {
  8. case 1:
  9. fmt.Println("Thumb")
  10. case 2:
  11. fmt.Println("Index")
  12. case 3:
  13. fmt.Println("Middle")
  14. case 4:
  15. fmt.Println("Ring")
  16. case 5:
  17. fmt.Println("Pinky")
  18. }
  19. }

Run in playground

在上述程序中,switch fingerfinger的值与每个 case 语句进行比较。该语句从上到下进行比较,并执行与表达式匹配的第一个case。在这个例子中,finger的值为 4,因此打印Ring

具有相同值的case是不被允许的。如果你试图运行下面的程序,编译器会报错main.go:18:2: duplicate case 4 in switch previous case at tmp/sandbox887814166/main.go:16:7

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. finger := 4
  7. switch finger {
  8. case 1:
  9. fmt.Println("Thumb")
  10. case 2:
  11. fmt.Println("Index")
  12. case 3:
  13. fmt.Println("Middle")
  14. case 4:
  15. fmt.Println("Ring")
  16. case 4://duplicate case
  17. fmt.Println("Another Ring")
  18. case 5:
  19. fmt.Println("Pinky")
  20. }
  21. }

Run in playground

默认的 case

我们手中只有 5 个手指。输入错误的手指号会发生什么?这是 默认的 case的用武之地。当其他case都不匹配时,将执行默认case

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. switch finger := 8; finger {
  7. case 1:
  8. fmt.Println("Thumb")
  9. case 2:
  10. fmt.Println("Index")
  11. case 3:
  12. fmt.Println("Middle")
  13. case 4:
  14. fmt.Println("Ring")
  15. case 5:
  16. fmt.Println("Pinky")
  17. default: //default case
  18. fmt.Println("incorrect finger number")
  19. }
  20. }

Run in playground

在上面的程序中,finger的值是 8 并且它与任何case都不匹配,因此打印incorrect finger number。默认case不一定是 switch 语句中的最后一个。它可以出现在switch的任何位置。

你可能注意到声明finger的一个小变化,它在switch中声明。switch可以包含一个可选的语句,它在表达式计算之前执行。在该行,switch finger := 8; finger,首先声明了finger并在表达式中使用,而finger的范围仅限于switch代码块。

case 可以拥有多个表达式

可以在一个case中用逗号分隔实现多个表达式。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. letter := "i"
  7. switch letter {
  8. case "a", "e", "i", "o", "u": //multiple expressions in case
  9. fmt.Println("vowel")
  10. default:
  11. fmt.Println("not a vowel")
  12. }
  13. }

Run in playground

上面的程序检查字母是否是元音。case "a", "e", "i", "o", "u":匹配所有元音。由于letter的值为i该程序输出vowel

表达式 switch

switch中的表达式是可选的,可以省略。如果省略表达式,则switch true,每个case表达式都视为true,并且执行相应的代码块。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. num := 75
  7. switch { // expression is omitted
  8. case num >= 0 && num <= 50:
  9. fmt.Println("num is greater than 0 and less than 50")
  10. case num >= 51 && num <= 100:
  11. fmt.Println("num is greater than 51 and less than 100")
  12. case num >= 101:
  13. fmt.Println("num is greater than 100")
  14. }
  15. }

Run in playground

在上述程序中,switch没有表达式,所以它被认为是true,并且会执行每一个casecase num >= 51 && num <= 100:true且程序输出num is greater than 51 and less than 100。这种类型的switch可以用来替代多个if else的情况。

fallthrough

在 Go 语言中,在执行case后立即从switch语句中返回。 fallthrough语句用于执行该case之后,再执行下一个case语句。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func number() int {
  6. num := 15 * 5
  7. return num
  8. }
  9. func main() {
  10. switch num := number(); { //num is not a constant
  11. case num < 50:
  12. fmt.Printf("%d is lesser than 50\n", num)
  13. fallthrough
  14. case num < 100:
  15. fmt.Printf("%d is lesser than 100\n", num)
  16. fallthrough
  17. case num < 200:
  18. fmt.Printf("%d is lesser than 200", num)
  19. }
  20. }

Run in playground

switchcase表达式不一定只能是常量。它们也可以在运行时进行赋值。在上面的程序中,num被初始化为函数number()的返回值。然后进入case语句的计算,case num < 100:true则程序打印75 is lesser than 100,下一个语句是fallthrough。当遇到fallthrough时,将会执行下一个case的语句,并且打印75 is lesser than 200,程序的输出是

  1. 75 is lesser than 100
  2. 75 is lesser than 200

fallthrough应该位于case语句中的最后。如果它出现在中间的某个位置,编译器会抛出错误fallthrough statement out of place

ft_authoradmin  ft_create_time2019-08-03 16:33
 ft_update_time2019-08-03 16:36