在Go語言中,defer語句會延遲函數(shù)或方法或匿名方法的執(zhí)行,直到附近的函數(shù)返回為止。換句話說,延遲函數(shù)或方法調(diào)用參數(shù)會立即求值,但是它們會執(zhí)行到附近的函數(shù)返回為止。您可以使用defer關(guān)鍵字創(chuàng)建延遲的方法,函數(shù)或匿名函數(shù)。
語法:
// 函數(shù) defer func func_name(parameter_list Type) return_type{ // Code } // 方法 defer func (receiver Type) method_name(parameter_list){ // Code } defer func (parameter_list)(return_type){ // code }()
注意事項:
在Go語言中,同一程序中允許多個defer語句,并且它們按LIFO(后進先出)順序執(zhí)行,如示例2所示。
在defer語句中,將在執(zhí)行defer語句時(而不是在調(diào)用它們時)評估參數(shù)。
defer語句通常用于確保在完成文件處理后關(guān)閉文件,關(guān)閉通道或捕獲程序中的緊急情況。
讓我們借助示例來討論這個概念:
范例1:
package main import "fmt" // 函數(shù) func mul(a1, a2 int) int { res := a1 * a2 fmt.Println("Result: ", res) return 0 } func show() { fmt.Println("Hello!, www.soo66.com Go語言菜鳥教程") } func main() { //調(diào)用mul()函數(shù) //這里mul函數(shù)的行為 //像普通函數(shù)一樣 mul(23, 45) //調(diào)用mul()函數(shù) //使用defer關(guān)鍵字 //這里是mul()函數(shù) //是延遲函數(shù) defer mul(23, 56) //調(diào)用show()函數(shù) show() }
輸出:
Result: 1035 Hello!, www.soo66.com Go語言菜鳥教程 Result: 1288
用法解釋:在上面的示例中,我們有兩個名為mul()和show()函數(shù)的函數(shù)。其中show()函數(shù)通常在main()函數(shù)中調(diào)用,同時我們以兩種不同的方式調(diào)用mul()函數(shù):
首先,我們像常規(guī)函數(shù)一樣調(diào)用mul函數(shù),即mul(23,45)并在函數(shù)調(diào)用時執(zhí)行(輸出:Result:1035)。
其次,我們使用defer關(guān)鍵字將mul()函數(shù)稱為defer函數(shù),即defer mul( 23,56),當所有周圍的方法返回時,它將執(zhí)行(輸出:Result:1288)。
范例2:
package main import "fmt" // 函數(shù) func add(a1, a2 int) int { res := a1 + a2 fmt.Println("Result: ", res) return 0 } func main() { fmt.Println("Start") //多個延遲語句 //以LIFO順序執(zhí)行 defer fmt.Println("End") defer add(34, 56) defer add(10, 10) }
輸出:
Start Result: 20 Result: 90 End