方式包裹Go語言中defer的一些坑

defer語句是Go中一個非常有用的特征,可以將一個方式延遲到包裹該方式的方式返回時履行,在實際利用中,defer語句可以充任其他語言中try…catch…的角色,也可以用來處置關閉文件句柄等收尾操作。

defer觸發機會

A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.

Go官方文檔中對defer的履行機會做了論述,分辨是。 - 包裹defer的函數返回時 - 包裹defer的函數履行到末尾時 - 所在的goroutine產生panic時

defer履行次序

當一個方式中有多個defer時, defer會將要延遲履行的方式“壓?!?,當defer被觸發時,將所有“壓?!钡姆绞健俺鰲!辈⒙男?。所以defer的履行次序是LIFO的。

所以下面這段代碼的輸出不是1 2 3,而是3 2 1。

func stackingDefers() { defer func() { fmt.Println("1") }() defer func() { fmt.Println("2") }() defer func() { fmt.Println("3") }() }
怎样看福建快3走势图