帶你學夠浪:Go語言基礎系列 - 8分鐘學控制流語句

文章每週持續更新,原創不易,「三連」讓更多人看到是對我最大的確定。能夠微信搜索公衆號「 後端技術學堂 」第一時間閱讀(通常比博客早更新一到兩篇)python

對於通常的語言使用者來講 ,20% 的語言特性就可以知足 80% 的使用需求,剩下在使用中掌握。基於這一理論,Go 基礎系列的文章不會刻意追求面面俱到,但該有知識點都會覆蓋,目的是帶你快跑遇上 Golang 這趟新車。web

Hurry up , Let's go !編程

控制語句是程序的靈魂,有了它們程序才能完成各類邏輯,今天咱們就來學習 Go 中的各類控制語句。後端

經過本文的學習你將掌握如下知識:微信

  • if 條件語句
  • for 循環語句
  • switch 語句
  • defer 延遲調用

if 條件語句

與大多數編程語言同樣,if 用於條件判斷,當條件表達式 exprtrue 執行 {} 包裹的消息體語句,不然不執行。less

語法是這樣的:編程語言

if expr {
    // some code
}

**注意:**語法上和 c 語言不一樣的是不用在條件表達式 expr 外帶括號,和 python 的語法相似。編輯器

固然,若是想在條件不知足的時候作點啥,就能夠 if 後帶 else 語句。語法:函數

if expr {
    // some code
} else {
    // another code
}

不只僅是 if

除了能夠在 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 語句。

for循環語句

當須要重複執行的時候須要用到循環語句,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 語句內,超出這個範圍就不能使用了。

while循環怎麼寫?

前面說了,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 語句

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 同 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 語句有延遲調用的效果。具體來講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 排版

相關文章
相關標籤/搜索