有時一個函數內需要根據最后是否出錯,決定是否執行某個操作。這時候如果函數的分支又比較多,就會比較麻煩了。
defer 處理這個情況剛好合適
func main() {
var err error
byErr(&err)
defer byErr(&err)
defer func(err *error) {
byErr2(*err)
}(&err)
err = errors.New("hi,beautiful girl")
byErr(&err)
}
func byErr(err *error) {
if *err != nil {
log.Println("is err")
}else {
log.Println("is nil")
}
}
func byErr2(err error) {
if err != nil {
log.Println("is err")
}else {
log.Println("is nil")
}
}
結果如下
2019/06/21 09:25:43 is nil
2019/06/21 09:25:43 is err
2019/06/21 09:25:43 is err
2019/06/21 09:25:43 is err
代碼里兩種方法都是可行的,但需要注意的是,稍不注意 照以下方式用 就bug了:
1,如果直接用 err 作為參數,會,恆為nil
2,如果用err 的指針作為參數, 會恆不為 nil