★文章每週持續更新,原創不易,「三連」讓更多人看到是對我最大的確定。能夠微信搜索公衆號「 後端技術學堂 」第一時間閱讀(通常比博客早更新一到兩篇)python
」
對於通常的語言使用者來講 ,20% 的語言特性就可以知足 80% 的使用需求,剩下在使用中掌握。基於這一理論,Go 基礎系列的文章不會刻意追求面面俱到,但該有知識點都會覆蓋,目的是帶你快跑遇上 Golang 這趟新車。web
Hurry up , Let's go !編程
控制語句是程序的靈魂,有了它們程序才能完成各類邏輯,今天咱們就來學習 Go 中的各類控制語句。後端
經過本文的學習你將掌握如下知識:微信
與大多數編程語言同樣,if
用於條件判斷,當條件表達式 expr
爲 true
執行 {}
包裹的消息體語句,不然不執行。less
語法是這樣的:編程語言
if expr {
// some code
}
**注意:**語法上和 c
語言不一樣的是不用在條件表達式 expr
外帶括號,和 python
的語法相似。編輯器
固然,若是想在條件不知足的時候作點啥,就能夠 if
後帶 else
語句。語法:函數
if expr {
// some code
} else {
// another code
}
除了能夠在 if
中作條件判斷以外,在 Golang 中你甚至能夠在 if
的條件表達式前執行一個簡單的語句。學習
舉個例子:
if x2 := 1; x2 > 10 {
fmt.Println("x2 great than 10")
} else {
fmt.Println("x2 less than 10", x2)
}
上面的例子在 if
語句中先聲明並賦值了 x2
,以後對 x2
作條件判斷。
注意:此處在 if
內聲明的變量 x2
做用域僅限於 if 和else 語句。
當須要重複執行的時候須要用到循環語句,Go 中只有 for
這一種循環語句。
標準的for循環語法:
for 初始化語句; 條件表達式; 後置語句 {
// some code
}
這種語法形式和 C 語言中 for
循環寫法仍是很像的,不一樣的是不用把這三個部分用 ()
括起來。循環執行邏輯:
true
則執行循環體內語句,不然不執行。
舉個例子:
sum := 0
for i := 0; i < 10; i++ {
sum += i // i做用域只在for語句內
fmt.Println(i, sum)
}
注意:循環變量i
的做用域只在 for
語句內,超出這個範圍就不能使用了。
前面說了,Golang 中只有 for
這一種循環語法,那有沒有相似 C 語言中 while
循環的寫法呢?答案是有的:把 for
語句的先後兩部分省略,只留中間的「條件表達式」的 for
語句等價於 while
循環。
像下面這樣:
sum1 := 0
for ;sum1 < 10; { // 能夠省略初始化語句和後置語句
sum1++
fmt.Println(sum1)
}
上面的示例沒有初始化語句和後置語句,會循環執行 10 次後退出。
固然你要是以爲先後的分號也不想寫了,也能夠省略不寫,上面的代碼和下面是等效的:
sum1 := 0
for sum1 < 10 { // 能夠省略初始化語句和後置語句,分號也能省略
sum1++
fmt.Println(sum1)
}
在 Golang 中死循環能夠這樣寫,至關於 C 語言中的 while(true)
for { // 死循環
// your code
}
switch
語句能夠簡化多個 if-else
條件判斷寫法,避免代碼看起來雜亂。
能夠先定義變量,而後在 switch
中使用這個變量。
a := 1
switch a {
case 1:
fmt.Println("case 1") // 不用寫break 執行到這自動跳出
case 2:
fmt.Println("case 2")
default:
fmt.Printf("unexpect case")
}
輸出:case 1
從 C 語言過來的朋友必定有這樣的經歷:常常會在 case 語句中漏掉 break 致使程序繼續往下執行,從而產生奇奇怪怪的 bug
,這種問題在 Golang 中不復存在了。
Golang 在每一個 case 後面隱式提供 break
語句。 除非以 fallthrough
語句結束,不然分支會自動終止。
switch a := 1; a { //這裏有分號
case 1: // case 無需爲常量,且取值沒必要爲整數。
fmt.Println("case 1") // 不用寫break 執行到自動跳出 除非以 fallthrough 語句結束
fallthrough
case 2:
fmt.Println("case 2")
default:
fmt.Printf("unexpect case")
}
輸出: case 1 case 2
還能夠直接在 switch
中定義變量後使用,可是要注意變量定義以後又分號,好比下面這樣:
switch b :=1; b { //注意這裏有分號
case 1:
fmt.Println("case 1")
case 2:
fmt.Println("case 2")
default:
fmt.Printf("unexpect case")
}
沒有條件的 switch 同 switch true
同樣,只有當 case
中的表達式值爲「真」時才執行,這種形式能簡化複雜的 if-else-if else
語法。
下面是用 if
來寫多重條件判斷,這裏寫的比較簡單如果再多幾個 else if
代碼結構看起來會更糟糕。
a := 1
if a > 0 {
fmt.Println("case 1")
} else if a < 0 {
fmt.Println("case 2")
} else {
fmt.Printf("unexpect case")
}
若是用上不帶條件的 switch
語句,寫出來就會簡潔不少,像下面這樣。
a := 1
switch { // 至關於switch true
case a > 0: // 若表達式爲「真」則執行
fmt.Println("case 1")
case a < 0:
fmt.Println("case 2")
default:
fmt.Printf("unexpect case")
}
defer
語句有延遲調用的效果。具體來講defer
後面的函數調用會被壓入堆棧,當外層函數返回纔會對壓棧的函數按後進先出順序調用。提及來有點抽象,舉個例子:
package main
import "fmt"
func main() {
fmt.Println("entry main")
for i := 0; i < 6; i++ {
defer fmt.Println(i)
}
fmt.Println("exit main")
}
fmt.Println(i)
不會每次當即執行,而是在 main
函數返回以後才依次調用,編譯運行上述程序的輸出:
entry main exit main //外層函數返回 5 4 3 2 1 0
上面是簡單的使用示例,實際使用中defer
一般用來釋放函數內部變量,由於它能夠在外層函數 return
以後繼續執行一些清理動做。
這在文件類操做異常處理中很是實用,好比用於釋放文件描述符,咱們之後會講解這塊應用,總之先記住 defer
延遲調用的特色。
經過本文的學習,咱們掌握了 Golang 中基本的控制流語句,利用這些控制語句加上一節介紹的變量等基礎知識,能夠構成豐富的程序邏輯,就能用 Golang 來作一些有意思的事情了。
感謝各位的閱讀,文章的目的是分享對知識的理解,技術類文章我都會反覆求證以求最大程度保證準確性,若文中出現明顯紕漏也歡迎指出,咱們一塊兒在探討中學習.
今天的技術分享就到這裏,咱們下期再見。
創做不易,白票不是好習慣,若是在我這有收穫,動動手指「點贊」「關注」是對我持續創做的最大支持。
★微信搜索公衆號「 後端技術學堂 」回覆「資料」「1024」有我給你準備的各類編程學習資料。文章每週持續更新,咱們下期見!
」
本文使用 mdnice 排版