1. 程式人生 > >go 隨聊-defer延遲呼叫

go 隨聊-defer延遲呼叫

本文只適合想要進階學習 Golang 的新手閱讀,大牛請繞道。

Go 語言中的 defer 語句是 UNIX 之父 Ken Thompson 大神發明的, 是完全正交的設計。

簡化資源的回收

這是最常見的 defer 用法. 比如:

mu.Lock()
defer mu.Unlock()

panic異常的捕獲

defer 除了用於簡化資源的釋放外, 還是Go語言異常框架的一個組成部分。

Go語言中,panic用於丟擲異常, recover用於捕獲異常。

recover只能在defer語句中使用, 直接呼叫recover是無效的。

Defer函式使用的坑

被defer的呼叫會在包含的函式的末尾執行,而不是包含程式碼塊的末尾。

import "fmt"

func Open(){
	fmt.Println("Open")
}
func Close(){
	fmt.Println("Close")
}

func main() {
	fmt.Println("開始")
	for i:=0;i<3;i++{
		Open()
		fmt.Println("do something")
		defer Close()
	}
	fmt.Println("結束")
}
---------------------------------------------
開始
Open
do something
Open
do something
Open
do something
結束
Close
Close
Close

如上程式碼,本來意圖是在for迴圈中,open之後,再close釋放相關資源,但是結果缺並不是想象的那樣。因為defer不會在程式碼塊生效,只會在它所在的函式生效。

正確做法是這樣:

import "fmt"

func Open(){
	fmt.Println("Open")
}
func Close(){
	fmt.Println("Close")
}

func main() {
	fmt.Println("開始")
	for i:=0;i<3;i++{
		func(){
			Open()
			fmt.Println("do something")
			defer Close()
		}()
	}
	fmt.Println("結束")
}
---------------------------------------------
開始
Open
do something
Close
Open
do something
Close
Open
do something
Close
結束