在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.jixiangtaizi.com.cn 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.jixiangtaizi.com.cn 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