条件语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. // 可以初始化子语句(只能有一个表达式)
  7. if a := 25; a > 20 {
  8. fmt.Println("a大于20")
  9. } else if a < 10 {
  10. fmt.Println("a小于10")
  11. } else {
  12. fmt.Println("10<=a<=20")
  13. }
  14. }

选择语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. grade := "B"
  7. marks := 90
  8. // 表达式switch写法1
  9. switch marks { // 也可以switch时初始化语句,写作 switch marks := 90; marks {
  10. case 90:
  11. grade = "A"
  12. case 80:
  13. grade = "B"
  14. case 60, 70:
  15. grade = "C"
  16. default:
  17. grade = "D"
  18. }
  19. fmt.Printf("grade: %s\n", grade)
  20. // 表达式switch写法2
  21. switch { // 也可以switch时初始化语句,写作 switch marks := 90; {
  22. case marks >= 90:
  23. grade = "A"
  24. case marks >= 80:
  25. grade = "B"
  26. case marks >= 70:
  27. grade = "C"
  28. case marks >= 60:
  29. grade = "D"
  30. default:
  31. grade = "E"
  32. }
  33. fmt.Printf("grade: %s\n", grade)
  34. // 表达式switch写法3-1
  35. switch {
  36. case grade == "A":
  37. fmt.Println("成绩优秀")
  38. case grade == "B":
  39. fmt.Println("表现良好")
  40. case grade == "C", grade == "D": // case 表达式可以有多个
  41. fmt.Println("再接再厉")
  42. default:
  43. fmt.Println("成绩不合格")
  44. }
  45. // 表达式switch写法3-2
  46. switch {
  47. case grade == "A":
  48. fmt.Println("成绩优秀")
  49. case grade == "B":
  50. fmt.Println("表现良好")
  51. case grade == "C":
  52. fallthrough // 同3-1,将两个表达式写一起
  53. case grade == "D":
  54. fmt.Println("再接再厉")
  55. default:
  56. fmt.Println("成绩不合格")
  57. }
  58. // 类型switch写法
  59. x = "1"
  60. switch i := x.(type) {
  61. case nil:
  62. fmt.Printf("i: %T\n", i)
  63. case int:
  64. fmt.Printf("i: %T\n", i)
  65. case float64:
  66. fmt.Printf("i: %T\n", i)
  67. case bool:
  68. fmt.Printf("i: %T\n", i)
  69. case string:
  70. fmt.Printf("i: %T\n", i)
  71. default:
  72. fmt.Printf("未知类型")
  73. }
  74. // select 语句
  75. a := make(chan int, 1024)
  76. b := make(chan int, 1024)
  77. for i := 0; i < 10; i++ {
  78. fmt.Printf("第%d次", i)
  79. a <- 1
  80. b <- 1
  81. select {
  82. case <-a:
  83. fmt.Println("from a")
  84. case <-b:
  85. fmt.Println("from b")
  86. }
  87. }
  88. }
  89. var x interface{} // 空接口

循环语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. for a := 0; a < 5; a++ {
  7. fmt.Printf("a: %v\n", a)
  8. }
  9. a := 0
  10. b := 5
  11. for a < b {
  12. fmt.Printf("a: %v\n", a)
  13. a++
  14. }
  15. /*
  16. 每一个for语句都可以使用一个特殊的range子语句,其作用类似迭代器可以轮询
  17. 1. 数组或切片值中的每一个元素
  18. 2. 字符串的每一个字符
  19. 3. 字典值中的每个键值对
  20. 4. 持续读取通道类型值中的元素
  21. 具体参考代码块后的表格
  22. */
  23. str := "abcd"
  24. for i, char := range str {
  25. fmt.Printf("字符串第%d个字符的值为%d\n", i, char)
  26. }
  27. for _, char := range str { // 忽略第1个参数
  28. fmt.Println(char)
  29. }
  30. for i := range str { // 忽略第2个参数
  31. fmt.Println(i)
  32. }
  33. for range str { // 忽略所有参数,只执行下面的代码块
  34. fmt.Println("执行成功")
  35. }
  36. }
右边表达式返回的类型 第一个值 第二个值
string index str[index], 返回类型为rune
array/slice index str[index]
map key m[key]
channel element

延迟语句

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 先输出 Hello 再输出world
  6. func main() {
  7. defer fmt.Println("world")
  8. fmt.Println("Hello")
  9. }
  10. /*
  11. defer用于延迟调用指定函数
  12. defer只能出现在函数内部
  13. defer后的表达式必须是外部函数的调用
  14. defer语句全部执行完毕,defer所在函数才算真正结束执行,才会执行return语句
  15. defer延迟特点可以用来回收资源、清理收尾等工作。使用defer语句之后,不用纠结回收代码放哪里,反正都是最后执行
  16. */
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. var i = 0
  6. func print() {
  7. fmt.Println(i)
  8. }
  9. /*
  10. 输出
  11. 5
  12. 5
  13. 5
  14. 5
  15. 5
  16. 解释
  17. defer在函数轮询之后执行,此时i为5
  18. */
  19. func main() {
  20. for ; i < 5; i++ {
  21. defer print()
  22. }
  23. }
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. var i = 0
  6. func print(i int) {
  7. fmt.Println(i)
  8. }
  9. /*
  10. 输出
  11. 4
  12. 3
  13. 2
  14. 1
  15. 0
  16. 解释
  17. defer 压栈是携带i值
  18. */
  19. func main() {
  20. for ; i < 5; i++ {
  21. defer print(i)
  22. }
  23. }

标签

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. LOOP1:
  7. for {
  8. x := 2
  9. switch {
  10. case x == 0:
  11. fmt.Println("A")
  12. break LOOP1
  13. case x == 1:
  14. fmt.Println("B")
  15. continue LOOP1
  16. case x == 2:
  17. fmt.Println("C")
  18. goto BREAK
  19. default:
  20. fmt.Println("C")
  21. }
  22. }
  23. BREAK:
  24. println("break")
  25. }