golang 用defer 捕獲error 需小心


有時一個函數內需要根據最后是否出錯,決定是否執行某個操作。這時候如果函數的分支又比較多,就會比較麻煩了。
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM