2_Flow_control_statements_for_if,_else_switch_and_defer

本文介绍了Go语言中for、if、switch和defer的用法。for循环由初始化、条件、后置语句组成,部分可选,可替代while;if和for无需小括号;switch是if - else简便写法,有别于Java/C++;defer可将函数推迟到外层函数返回后执行,多个defer按栈方式执行。
  • for

    (1) 基本的 for 循环由三部分组成,它们用分号隔开

    初始化语句:在第一次迭代前执行

    条件表达式:在每次迭代前求值,一旦为false就终止循环

    后置语句:在每次迭代的结尾执行

    (2) 初始化语句通常为一句__短变量声明__(使用:=),该变量声明仅在for语句的作用域中可见

    (3) 和 C、Java、JavaScript 之类的语言不同,Go 的 for 语句后面的三个构成部分外__没有小括号__(加上小括号会报错), 大括号 { } 则是必须的

      package main
    
      import "fmt"
    
      func main() {
    
          sum := 0
    
          for i := 0; i < 10; i++ {
              sum += i
          }
    
          fmt.Println(sum)
      }
    

    (4) for循环三个部分中的__初始化语句__和__后置语句__都是可选的

      package main
    
      import "fmt"
    
      func main() {
    
          sum := 1
    
          for ; sum < 1000; {
              sum += sum
          }
    
          fmt.Println(sum)
      }
    

    (5) go语言中没有while,只有for,(4)中的例子完全可以写的更简略,这样就代替了while

      package main
    
      import "fmt"
    
      func main() {
    
          sum := 1
    
          for sum < 1000 {
              sum += sum
          }
    
          fmt.Println(sum)
      }
    

    (6) 还可以完全省略,作为无限循环

      package main
    
      func main() {
    
          for {
          }
      }
    
  • if

    (1) if和for一样,也是__无需小括号__,需要大括号

      package main
    
      import (
          "fmt"
          "math"
      )
    
      func sqrt(x float64) string {
    
          if x < 0 {
              return sqrt(-x) + "i"
          }
    
          return fmt.Sprint(math.Sqrt(x))
      }
    
      func main() {
    
          fmt.Println(sqrt(2), sqrt(-4))
      }
    

    (2) if和for一样,条件表达式前面也可以加上简短语句,变量作用域仅为if块和对应的else块

      package main
    
      import (
          "fmt"
          "math" 
      )
    
      func pow(x, n, lim float64) float64 {
    
          if v := math.Pow(x, n); v < lim {
              return v
          } else {
              fmt.Printf("%g >= %g\n", v, lim)
          }
    
          // 这里开始就不能使用 v 了
          return lim
      }
    
      func main() {
    
          fmt.Println(
              pow(3, 2, 10),
              pow(3, 3, 20),
          )
      }
    
  • switch

    (1) 功能:是编写一连串 if - else 语句的简便方法,它运行第一个值等于条件表达式的 case 语句

    (2) 和Java/C++的switch区别

    1° 每个case后__自动加上__break,也就是说只会执行一个case

    2° case中的值__不必为常量__,也__不必为整数__

    3° switch条件表达式之前和for和if一样,也可以加上短语句

      package main
    
      import (
          "fmt"
          "runtime"
      )
    
      func main() {
    
          fmt.Print("Go runs on ")
    
          switch os := runtime.GOOS; os {
          case "darwin":
              fmt.Println("OS X.")
          case "linux":
              fmt.Println("Linux.")
          default:
              fmt.Printf("%s.\n", os)
          }
      }
    

    (3) case中的值甚至可以是一个函数的返回值

      switch i {
          case 0:
          case f():
      }
    

    从上到下顺次执行,在 i==0 时 f 不会被调用

    (4) 没有条件的switch,作用相当于更加清晰版的__一串if-else__

      package main
    
      import (
          "fmt"
          "time"
      )
    
      func main() {
    
          t := time.Now()
    
          switch {
              case t.Hour() < 12:
                  fmt.Println("Good morning!")
              case t.Hour() < 17:
                  fmt.Println("Good afternoon.")
              default:
                  fmt.Println("Good evening.")
          }
      }
    
  • defer

    (1) 作用:将函数推迟到外层函数返回之后执行;如果有多个defer,则按照__栈的方式__执行后进先出

      package main
    
      import "fmt"
    
      func main() {
    
          fmt.Println("counting")
    
          for i := 0; i < 10; i++ {
              defer fmt.Println(i)
          }
    
          fmt.Println("done")
      }
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值