Go語言的流程控制主要包括條件分支、循環和併發。在本章,咱們先來談談基本的流程控制語句。具體到本小節,咱們將說起if
語句。併發
if
語句通常會由關鍵字if
、條件表達式和由花括號包裹的代碼塊組成。所謂代碼塊,便是包含了若干表達式和語句的序列。在Go語言中,代碼塊必須由花括號包裹。另外,這裏的條件表達式是指其結果類型是bool
的表達式。一條最簡單的if
語句能夠是:spa
if 100 > number { number += 3 }
這裏的標識符number
能夠表明一個int
類型的值。這條if
語句的意思是:若是number
的值小於100
,那麼就把其值增長3
。我還能夠在此之上添加else
分支,就像這樣:code
if 100 > number { number += 3 } else { number -= 2 }
else
分支的含義是,提供在條件不成立(具體到這裏是number
的值不小於100
)的狀況下須要執行的操做。除此以外,if
語句還支持串聯。請看下面的例子: 作用域
if 100 > number { number += 3 } else if 100 < number { number -= 2 } else { fmt.Println("OK!") }
能夠看到,上述代碼很像是把多條if
語句串接在一塊兒了同樣。這樣的if
語句用於對多個條件的綜合判斷。上述語句的意思是,若number
的值小於100
則將其加3
,若number
的值大於100
則將其減2
,若number
的值等於100
則打印OK!
。
注意,咱們至此還未對number
變量進行聲明。上面的示例也所以不能經過編譯。咱們固然能夠用單獨的語句來聲明該變量併爲它賦值。可是咱們也能夠把這樣的變量賦值直接加入到if
子句中。示例以下:編譯
if number := 4; 100 > number { number += 3 } else if 100 < number { number -= 2 } else { fmt.Println("OK!") }
這裏的number := 4
被叫作if
語句的初始化子句。它應被放置在if
關鍵字和條件表達式之間,並與前者由空格分隔、與後者由英文分號;
分隔。注意,咱們在這裏使用了短變量聲明語句,即:在聲明變量number
的同時爲它賦值。這意味着這裏的number
被視爲一個新的變量。它的做用域僅在這條i
語句所表明的代碼塊中。也能夠說,變量number
對於該if
語句以外的代碼來講是不可見的。咱們若要在該if
語句之外使用number
變量就會形成編譯錯誤。
另外還要注意,即便咱們已經在這條if
語句所表明的代碼塊以外聲明瞭number
變量,這裏的語句number := 4
也是合法的。請看這個例子:變量
var number int if number := 4; 100 > number { number += 3 } else if 100 < number { number -= 2 } else { fmt.Println("OK!") }
這種寫法有一個專有名詞,叫作:標識符的重聲明。實際上,只要對同一個標識符的兩次聲明各自所在的代碼塊之間存在包含的關係,就會造成對該標識符的重聲明。具體到這裏,第一次聲明的number
變量所在的是該if
語句的外層代碼塊,而number := 4
所聲明的number
變量所在的是該if
語句的表明代碼塊。它們之間存在包含關係。所以對number
的重聲明就造成了。
這種狀況形成的結果就是,if
語句內部對number
的訪問和賦值都只會涉及到第二次聲明的那個number
變量。這種現象也被叫作標識符的遮蔽。上述代碼被執行完畢以後,第二次聲明的number
變量的值會是7
,而第一次聲明的number
變量的值仍會是0
。循環