循環(huán)結(jié)構(gòu)
Go中只存在一種循環(huán)結(jié)構(gòu)-for循環(huán)。基本的for循環(huán)由三部分組成:
- 初始化語(yǔ)句:第一次迭代前執(zhí)行
- 條件表達(dá)式:每次迭代前執(zhí)行
- 后置語(yǔ)句:每次迭代后執(zhí)行
Go的for循環(huán)語(yǔ)句后面不需要小括號(hào)包裹,但是必須存在大括號(hào)。此外,初始化語(yǔ)句與后置語(yǔ)句可以省略,因?yàn)镚o中的for等價(jià)于C中的while,一次當(dāng)我們寫無(wú)限循環(huán)時(shí)可以忽略條件表達(dá)式,將for循環(huán)寫到很緊湊的程度,例如:
package main
import "fmt"
func main(){
for{//無(wú)線循環(huán)
fmt.Println("Hello World");
}
}
if
Go的if語(yǔ)句與for相似,不需要括號(hào),但是必須存在大括號(hào)。與其他語(yǔ)言中的if語(yǔ)句不通的是Go中的if可以在表達(dá)式之前執(zhí)行一個(gè)簡(jiǎn)單的語(yǔ)句,而該語(yǔ)句中聲明的變量只能在if之中,可以參考如下代碼:
package main
import(
"fmt"
"math"
)
func pow(x,y,max float64) float64{
if v := math.Pow(x,y); v<max{
return v
}else{
fmt.Println("%g >= %g",v,max)
}
return max
}
func main(){
fmt.Println(
pow(3,2,10),
pow(3,3,20),
)
}
從上述代碼中我們可以看出,if語(yǔ)句表達(dá)式之前的簡(jiǎn)單語(yǔ)句需要以分號(hào)與條件語(yǔ)句隔開(kāi)。
switch
同理switch語(yǔ)句與其他語(yǔ)句的差別也是在條件一句前可以存在簡(jiǎn)單語(yǔ)句且以分好隔開(kāi),不需要小括號(hào)而是必須存在大括號(hào)。特別需要說(shuō)明的是which語(yǔ)句只有當(dāng)以fallthrough語(yǔ)句結(jié)束時(shí)才能繼續(xù)執(zhí)行下一個(gè)case否則將直接結(jié)束分支。switch語(yǔ)句頁(yè)可以不存在條件語(yǔ)句,此時(shí)等同于if-then-else結(jié)構(gòu)。代碼如下:
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")
fallthrough
default:
fmt.Println("Good Evening")
}
}
我寫代碼的時(shí)候是下午15點(diǎn),因此執(zhí)行之后會(huì)輸出”Good Afternoon”與”Good Evning”兩條語(yǔ)句。
defer
defer語(yǔ)句會(huì)將函數(shù)推遲到外層函數(shù)返回之后執(zhí)行。推遲調(diào)用的函數(shù)其參數(shù)會(huì)立即求值,但直到外層函數(shù)返回前該函數(shù)都不會(huì)被調(diào)用。推遲的函數(shù)調(diào)用會(huì)被壓入一個(gè)棧中。當(dāng)外層函數(shù)返回時(shí),被推遲的函數(shù)會(huì)按照后進(jìn)先出的順序調(diào)用。