1. 条件语句switch

1.1.1. switch 语句

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。 Golang switch 分支表达式可以是任意类型,不限于常量。可省略 break,默认自动终止。

语法

Go 编程语言中 switch 语句的语法如下:

  1. switch var1 {
  2. case val1:
  3. ...
  4. case val2:
  5. ...
  6. default:
  7. ...
  8. }

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。 您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

实例:

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 定义局部变量 */
  5. var grade string = "B"
  6. var marks int = 90
  7. switch marks {
  8. case 90: grade = "A"
  9. case 80: grade = "B"
  10. case 50,60,70 : grade = "C"
  11. default: grade = "D"
  12. }
  13. switch {
  14. case grade == "A" :
  15. fmt.Printf("优秀!\n" )
  16. case grade == "B", grade == "C" :
  17. fmt.Printf("良好\n" )
  18. case grade == "D" :
  19. fmt.Printf("及格\n" )
  20. case grade == "F":
  21. fmt.Printf("不及格\n" )
  22. default:
  23. fmt.Printf("差\n" )
  24. }
  25. fmt.Printf("你的等级是 %s\n", grade )
  26. }

以上代码执行结果为:

  1. 优秀!
  2. 你的等级是 A

1.1.2. Type Switch

switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。

Type Switch 语法格式如下:

  1. switch x.(type){
  2. case type:
  3. statement(s)
  4. case type:
  5. statement(s)
  6. /* 你可以定义任意个数的case */
  7. default: /* 可选 */
  8. statement(s)
  9. }

实例:

  1. package main
  2. import "fmt"
  3. func main() {
  4. var x interface{}
  5. //写法一:
  6. switch i := x.(type) { // 带初始化语句
  7. case nil:
  8. fmt.Printf(" x 的类型 :%T\r\n", i)
  9. case int:
  10. fmt.Printf("x 是 int 型")
  11. case float64:
  12. fmt.Printf("x 是 float64 型")
  13. case func(int) float64:
  14. fmt.Printf("x 是 func(int) 型")
  15. case bool, string:
  16. fmt.Printf("x 是 bool 或 string 型")
  17. default:
  18. fmt.Printf("未知型")
  19. }
  20. //写法二
  21. var j = 0
  22. switch j {
  23. case 0:
  24. case 1:
  25. fmt.Println("1")
  26. case 2:
  27. fmt.Println("2")
  28. default:
  29. fmt.Println("def")
  30. }
  31. //写法三
  32. var k = 0
  33. switch k {
  34. case 0:
  35. println("fallthrough")
  36. fallthrough
  37. /*
  38. Go的switch非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项;
  39. 而如果switch没有表达式,它会匹配true。
  40. Go里面switch默认相当于每个case最后带有break,
  41. 匹配成功后不会自动向下执行其他case,而是跳出整个switch,
  42. 但是可以使用fallthrough强制执行后面的case代码。
  43. */
  44. case 1:
  45. fmt.Println("1")
  46. case 2:
  47. fmt.Println("2")
  48. default:
  49. fmt.Println("def")
  50. }
  51. //写法三
  52. var m = 0
  53. switch m {
  54. case 0, 1:
  55. fmt.Println("1")
  56. case 2:
  57. fmt.Println("2")
  58. default:
  59. fmt.Println("def")
  60. }
  61. //写法四
  62. var n = 0
  63. switch { //省略条件表达式,可当 if...else if...else
  64. case n > 0 && n < 10:
  65. fmt.Println("i > 0 and i < 10")
  66. case n > 10 && n < 20:
  67. fmt.Println("i > 10 and i < 20")
  68. default:
  69. fmt.Println("def")
  70. }
  71. }

以上代码执行结果为:

  1. x 的类型 :<nil>
  2. fallthrough
  3. 1
  4. 1
  5. def