07.06-Defer, Panic & Recover
Go 有一個特殊的陳述句,稱為 defer
會在一個函式執行完畢之後,將該函式呼叫加入排班,請見下列的範例:
package main
import "fmt"
func first() {
fmt.Println("1st")
}
func second() {
fmt.Println("2nd")
}
func main() {
defer second()
first()
}
此程式會先印出 1st
,並接著印出 2nd
,基本上 defer 會將呼叫移到函式尾端的 second
。
func main() {
first()
second()
}
defer
通常用於需要以某種方式釋放資源時,例如:當我們開啟一個檔案時,我們需要能夠確定之後會關閉檔案。使用 defer
:
f, _ := os.Open(filename)
defer f.Close()
這樣有三項優點:(1) 讓我們的 Close
呼叫可以靠近我們的 Open
呼叫,使得易於了解呼叫的用處 (2) 若我們的函式有多個 return 陳述句時(或許 if
裡面有一個,而 else
裡面也有一個) Close
會在這兩個 return 之前執行 (3) 受到 defer 的函式即使在執行期當掉了,也能運作。
Last updated