語句
分為一般語言都有的語句:
- 選擇語句:if...else, switch
- 循環(huán)語句:for
Go特有的語句:
- 并發(fā)go和通信chan
- 延遲defer、panic和recover
選擇語句
if... else...
// 推薦的用法是不用else艘包,直接在if里返回
if err := doSome(); err != nil {
xxx
}
xxxx
swith
// 不需要break(相當(dāng)于每個(gè)case下會(huì)默認(rèn)幫忙補(bǔ)全break)
// 如果需要連續(xù)執(zhí)行肤晓,需要添加fallthrough
switch val.(type) {
case string:
xxx
case int, int32, int64:
xxx
case bool:
xxx
fallthrough
case float64:
xxx
default:
xxx
}
循環(huán)語句
for
// 一般的索引遞增
for i:=0; i< len(arr); i++ {
xxx
}
// for ...range進(jìn)行遍歷
for k,v := range map {
xxx
}
for i, item := range arr {
xxx
}
并發(fā)
使用go關(guān)鍵詞創(chuàng)建并發(fā)(異步)
go func(){
doAPIReq()
}()
延遲、panic和 recover
使用defer語句定義延遲操作调鬓,定義的延遲操作會(huì)在return的前一步執(zhí)行
通常用于關(guān)閉通道艇炎、文件等
func getFileContent() string {
f, _ := os.OpenFile(name, os.O_RDONLY, 0)
defer f.Close() // idiomatic Go code!
contents, _ := ioutil.ReadAll(f)
return string(contents)
}
panic和error的區(qū)別是,err 是將錯(cuò)誤記錄下來腾窝。但是panic是在遇到預(yù)期之外的錯(cuò)誤缀踪,記錄錯(cuò)誤,并中斷程序
的執(zhí)行虹脯。
func doSome() {
xxx
//這里發(fā)生了什么驴娃,預(yù)期之外
if xxx {
panic("info")
}
}
recover用于恢復(fù)異常,通常是在一個(gè)方法A內(nèi)發(fā)生了panic循集,則在調(diào)用A的外層方法中實(shí)行recover()唇敞,恢復(fù)程序的執(zhí)行,并轉(zhuǎn)換成err咒彤。
func B() {
defer func(){
if e := recover(); e != nil {
xxx
}
}()
doSome()
}