1 if 条件

  • 条件语句不需要使用括号将条件包起来
  • 无论语句体内有几条语句,花括号 {} 都是必须存在的
  • 左花括号 { 必须与 if 或者 else 处于同一行
  • 在 if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 间隔
  • 在有返回值的函数中,不允许将“最终的” return 语句包含在 if…else… 结构中,否则会编译失败
    1. if a < 5 {
    2. return 0
    3. } else {
    4. return 1
    5. }

    2 switch 选择

    和c++不同,不需要给每个case都手动加入break ```go package main

import “fmt”

func main() { var i = 1 switch i { case 0: fmt.Printf(“0”) case 1: fmt.Printf(“1”) // case匹配后执行完会自动跳出switch case 2: fallthrough // 加上fallthrough, 会继续执行下一个case case 3: fmt.Printf(“3”) case 4, 5, 6: fmt.Printf(“4, 5, 6”) default: fmt.Printf(“Default”) } }

  1. switch 后面的表达式甚至不是必需的
  2. ```go
  3. func main() {
  4. var Num = 5
  5. switch {
  6. case 0 <= Num && Num <= 3:
  7. fmt.Printf("0-3")
  8. case 4 <= Num && Num <= 6:
  9. fmt.Printf("4-6")
  10. case 7 <= Num && Num <= 9:
  11. fmt.Printf("7-9")
  12. }
  13. }

switch还可用作类型断言

  1. func test(i interface{}) {
  2. switch i.(type) {
  3. case int:
  4. fmt.Printf("Twice %v is %v\n", v, v*2)
  5. case string:
  6. fmt.Printf("%q is %v bytes long\n", v, len(v))
  7. default:
  8. fmt.Printf("I don't know about type %T!\n", v)
  9. }
  10. }

3 for 循环

Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while结构

  1. sum := 0
  2. for i := 0; i < 10; i++ {
  3. sum += i
  4. }

可以看到比较大的一个不同在于 for 后面的条件表达式不需要用圆括号 () 包含起来。
Go语言还进一步考虑到无限循环的场景,让开发者不用写无聊的 for (;;) {} 和 do {} while(1);

  1. sum := 0
  2. for {
  3. sum++
  4. if sum > 100 {
  5. break
  6. }
  7. }

在条件表达式中也支持多重赋值

  1. a := []int{1, 2, 3, 4, 5, 6}
  2. for i, j := 0, len(a) 1; i < j; i, j = i + 1, j 1 {
  3. a[i], a[j] = a[j], a[i]
  4. }

Go语言的 for 循环同样支持 continue 和 break 来控制循环,
但是它提供了一个更高级的break ,可以选择中断哪一个循环:

  1. for j := 0; j < 5; j++ {
  2. for i := 0; i < 10; i++ {
  3. if i > 5 {
  4. break JLoop
  5. }
  6. fmt.Println(i)
  7. }
  8. }
  9. JLoop:
  10. // ...

range

  1. nums := []int{2, 3, 4}
  2. //在数组上使用range将传入index和值两个变量。
  3. for i, num := range nums {
  4. if num == 3 {
  5. fmt.Println("index:", i)
  6. }
  7. }

4 goto 跳转

goto 还是会在一些场合下被证明是最合适的。
goto 语句的语义非常简单,就是跳转到本函数内的某个标签

  1. func myfunc() {
  2. i := 0
  3. HERE:
  4. fmt.Println(i)
  5. i++
  6. if i < 10 {
  7. goto HERE
  8. }
  9. }

5 break

break只会跳出最里层的for, switch, select, 除非后面加上Label

  1. func worker(ctx context.Context) {
  2. LOOP:
  3. for {
  4. fmt.Println("worker")
  5. time.Sleep(time.Second)
  6. select {
  7. case <-ctx.Done(): // 等待上级通知
  8. break LOOP
  9. default:
  10. }
  11. }
  12. wg.Done()
  13. }