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)
}
(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))
}
(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),
)
}
(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),
)
}
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)
}
}
(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.")
}
}
(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.")
}
}
4、defer
(1)、基本用法
defer 語句會将函數推遲到外層函數傳回之後執行。
推遲調用的函數其參數會立即求值,但直到外層函數傳回前該函數都不會被調用。
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Print("Hello ")
}
(2)、defer棧
推遲的函數調用會被壓入一個棧中。當外層函數傳回時,被推遲的函數會按照後進先出的順序調用。
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}