天天看點

Go語言從入門到規範-1.3、Go基礎之流程控制

Go語言從入門到規範-1.3、Go基礎之流程控制

文章目錄

  • ​​Go語言從入門到規範-1.3、Go基礎之流程控制​​
  • ​​1、for循環​​
  • ​​(1)、基本用法​​
  • ​​(2)、for進階​​
  • ​​(3)、for是Go中的while​​
  • ​​(4)、無限循環​​
  • ​​2、if條件判斷​​
  • ​​(1)、基本用法​​
  • ​​(2)、if簡短語句​​
  • ​​(3)、if和else​​
  • ​​3、switch​​
  • ​​(1)、基礎用法​​
  • ​​(2)、switch求值順序​​
  • ​​(3)、沒有條件的switch​​
  • ​​4、defer​​
  • ​​(1)、基本用法​​
  • ​​(2)、defer棧​​

1、for循環

(1)、基本用法

Go 隻有一種循環結構:​

​for​

​ 循環。

基本的 ​

​for​

​ 循環由三部分組成,它們用分号隔開:

  • 初始化語句:在第一次疊代前執行
  • 條件表達式:在每次疊代前求值
  • 後置語句:在每次疊代的結尾執行

初始化語句通常為一句短變量聲明,該變量聲明僅在 ​

​for​

​ 語句的作用域中可見。

一旦條件表達式的布爾值為 ​

​false​

​,循環疊代就會終止。

注意:和 C、Java、JavaScript 之類的語言不同,Go 的 for 語句後面的三個構成部分外沒有小括号, 大括号 ​

​{ }​

​ 則是必須的。

package main

import "fmt"

func main() {
    sum := 0
    for i:=0; i < 10; i++ {
        sum+=i
    }

    fmt.Println(sum)
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(2)、for進階

初始化語句和後置語句是可選的。

package main

import "fmt"

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

(3)、for是Go中的while

此時你可以去掉分号,因為 C 的 ​

​while​

​​ 在 Go 中叫做 ​

​for​

​。

package main

import "fmt"

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

(4)、無限循環

如果省略循環條件,該循環就不會結束,是以無限循環可以寫得很緊湊。

package main

func main() {
    for {
    }
}      

2、if條件判斷

(1)、基本用法

Go 的 ​

​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))
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(2)、if簡短語句

同 ​

​for​

​​ 一樣, ​

​if​

​ 語句可以在條件表達式前執行一個簡單的語句。

該語句聲明的變量作用域僅在 ​

​if​

​ 之内。

(在最後的 ​

​return​

​​ 語句處使用 ​

​v​

​ 看看。)

package main

import (
    "fmt"
    "math"
)

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v <lim {
        return v
    }

    return lim
}

func main() {
    fmt.Print(
        pow(3, 2, 10),
        pow(3, 3, 20),
    )
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(3)、if和else

在 ​

​if​

​​ 的簡短語句中聲明的變量同樣可以在任何對應的 ​

​else​

​ 塊中使用。

(在 ​

​main​

​​ 的 ​

​fmt.Println​

​​ 調用開始前,兩次對 ​

​pow​

​ 的調用均已執行并傳回其各自的結果。)

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),
        )
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

3、switch

(1)、基礎用法

​switch​

​​ 是編寫一連串 ​

​if - else​

​ 語句的簡便方法。它運作第一個值等于條件表達式的 case 語句。

Go 的 switch 語句類似于 C、C++、Java、JavaScript 和 PHP 中的,不過 Go 隻運作標明的 case,而非之後所有的 case。 實際上,Go 自動提供了在這些語言中每個 case 後面所需的 ​

​break​

​​ 語句。 除非以 ​

​fallthrough​

​ 語句結束,否則分支會自動終止。 Go 的另一點重要的不同在于 switch 的 case 無需為常量,且取值不必為整數。

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)
    }
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(2)、switch求值順序

switch 的 case 語句從上到下順次執行,直到比對成功時停止。

(例如,

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

在 ​

​i==0​

​​ 時 ​

​f​

​ 不會被調用。)

注意: Go 練習場中的時間總是從 2009-11-10 23:00:00 UTC 開始,該值的意義留給讀者去發現。

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("When's Saturday?")
    today := time.Now().Weekday()
    switch time.Saturday {
    case today + 0:
        fmt.Println("Today.")
    case today + 1:
        fmt.Println("Tomorrow.")
    case today + 2:
        fmt.Println("In two days.")
    default:
        fmt.Println("Too far away.")
    }
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(3)、沒有條件的switch

沒有條件的 switch 同 ​

​switch true​

​ 一樣。

這種形式能将一長串 if-then-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.")
    }
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

4、defer

(1)、基本用法

defer 語句會将函數推遲到外層函數傳回之後執行。

推遲調用的函數其參數會立即求值,但直到外層函數傳回前該函數都不會被調用。

package main

import "fmt"

func main() {
    defer fmt.Println("world")

    fmt.Print("Hello ")
}      
Go語言從入門到規範-1.3、Go基礎之流程控制

(2)、defer棧

推遲的函數調用會被壓入一個棧中。當外層函數傳回時,被推遲的函數會按照後進先出的順序調用。

package main

import "fmt"

func main() {
    fmt.Println("counting")

    for i := 0; i < 10; i++ {
        defer fmt.Println(i)
    }

    fmt.Println("done")
}