if 语句

特点

  • if 后面的条件判断不需要用小括号括起来
  • { 必须放在行尾,和ifelse if / else放在一行
  • if 后面可以带一个简单的初始化语句,并以分好进行分割,该简单语句声明的变量的作用域是整个if 语句块,包括后面的else ifelse 分支。
  • Go语言没有三元运算符?:
  • if 分支遇到 return 后直接返回。

    示例

    1. if x := f(); x < y { // 在初始化语句中声明变量x, x的值为函数f()的执行结果
    2. return x
    3. } else if x > z { // x可以在条件中访问,也可以在代码块中访问
    4. return z
    5. } else {
    6. return y
    7. }

    switch 语句

    特点

  • switchif 语句一样,switch 后面可以带一个可选的简单的初始化语句。

  • switch 后面的表达式是可选的,如果没有表达式,则case子句是一个布尔表达式,而不是一个值。
  • switch 条件表达式的值可以是任意支持相等比较运算的类型变量
  • 多个case值使用逗号分隔。
  • 多个 case 表达式之间不需要使用 break 来跳出。
  • 通过 fallthrough 语句来强制执行下一个 case 子句(不再判断下一个 case 语句的条件是否满足)
  • switch 支持 default 语句,并且 default 语句可以放在任意位置。

    示例

    ```go f := func() string { return “Y” } switch x := f(); x { // switch后面带上一个初始化语句,此时x为f() 运行结果 case “Y”, “y”: // 多个case值可以使用,进行分隔 fmt.Println(“yes”) default: // 当条件都不满足时的默认情况,default的顺序不影响代码执行 fmt.Println(“Unknown”) case “n”, “N”: fmt.Println(“No”) }

// 使用fallthrough强制执行下面的case switch x := f(); x { // switch后面带上一个初始化语句,此时x为f() 运行结果 case “Y”, “y”: // 多个case值可以使用,进行分隔 fmt.Println(“yes”) fallthrough // fallthrough只影响下一个的case或default case “n”, “N”: fmt.Println(“No”) // 上层有fallthrough此时No分支也会执行 case “m”, “M”: fmt.Println(“Me”) // 上层没有fallthrough 此时Me分支不会执行 }

// 没有表达式的switch score := 85 switch { case score >= 90: // 没有条件表达式时,case语句需要是一个布尔值表达式 fmt.Println(“A”)
case score >= 80: fmt.Println(“B”) // 不需要使用break跳出switch后面也不会执行 case score >= 70: fmt.Println(“C”) case score >= 60: fmt.Println(“D”) default: fmt.Println(“F”) }

//输出: B

  1. <a name="LIo2g"></a>
  2. ### for 语句
  3. <a name="NHC3Y"></a>
  4. #### 特点
  5. - 可以使用普通的for循环
  6. - 可以使用条件循环,相当于 `while(condition)`
  7. - 可以使用无限循环,相当于 `while(true)`
  8. - 可以使用循环遍历数组,切片,字符串,map和通道。
  9. <a name="0c0dg"></a>
  10. #### 示例
  11. ```go
  12. // 1. 普通for循环
  13. for i := 0; i < 100; i++ {
  14. fmt.Println(i) //0 1 2 3 ... 99
  15. }
  16. // 2. 条件循环
  17. i := 1
  18. for i < 100 {
  19. fmt.Println(i) // 1 5 25
  20. i *= 5
  21. }
  22. // 3. 无限循环
  23. for { }
  24. // 4. 遍历数组,切片,字符串,map和通道
  25. arr := [2]int{1, 2}
  26. m := map[string]int{"a": 1, "b": 10}
  27. str := "hello, 世界"
  28. s := make([]int, 10)
  29. // 遍历数组/切片
  30. for index, value := range arr{ }
  31. for index := range arr { }
  32. for _, value := range arr{ }
  33. // 遍历map
  34. for key, value := range m {}
  35. for key := range m{}
  36. for _, value := range m {}
  37. // 遍历字符串
  38. for i :=0;i<len(str);i++ { // 遍历字节数组
  39. fmt.Println(str[i])
  40. }
  41. for i, v := range str { // 遍历rune数组
  42. fmt.Println(i, v)
  43. }
  44. // 访问通道
  45. for value := range channel{} // 访问通道时,只有一个参数

标签和跳转

标签

Go语言使用标签 Label 来标识一个语句的位置,用于 goto, break, continue 语句的跳转。

  1. Label:
  2. Statement

goto

goto 语句用于函数的内部跳转,需要配合标签使用,使用 goto Label 会跳转到标签名后的语句处执行。

  • goto语句只能在函数内跳转
  • goto语句不能跳过内部变量声明语句,这些变量在goto语句的标签语句处又是可见的
  • goto语句只能跳到同级作用域或者上层作用域内,不能跳转到内部作用域内
  • goto之后,goto后面的代码不会执行
  • 闭包内的goto不能调动上层作用域的Label ```go // goto 语句不能跳过变量声明 func main() { goto L v := 3 // ❌goto L jumps over declaration of v L: fmt.Println(“L”) }

// goto不能在闭包中使用 func main() { fmt.Println(1) func() { fmt.Println(“Nested function”) goto End // ❌label End not definedgo }() End: fmt.Println(2) }

// goto 语句作用域 func main() { if n % 2 == 1 { goto L1 // ❌goto L1 jumps into block starting } for n > 0 { n— L1: n— } } ```