在Go语言中,defer语句会延迟函数或方法或匿名方法的执行,直到附近的函数返回为止。换句话说,延迟函数或方法调用参数会立即求值,但是它们会执行到附近的函数返回为止。您可以使用defer关键字创建延迟的方法,函数或匿名函数。
语法:
// 函数
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(后进先出)顺序执行,如示例2所示。
在defer语句中,将在执行defer语句时(而不是在调用它们时)评估参数。
defer语句通常用于确保在完成文件处理后关闭文件,关闭通道或捕获程序中的紧急情况。
让我们借助示例来讨论这个概念:
范例1:
package main
import "fmt"
// 函数
func mul(a1, a2 int) int {
res := a1 * a2
fmt.Println("Result: ", res)
return 0
}
func show() {
fmt.Println("Hello!, www.div.cn Go语言大卫编程网")
}
func main() {
//调用mul()函数
//这里mul函数的行为
//像普通函数一样
mul(23, 45)
//调用mul()函数
//使用defer关键字
//这里是mul()函数
//是延迟函数
defer mul(23, 56)
//调用show()函数
show()
}
输出:
Result: 1035
Hello!, www.div.cn Go语言大卫编程网
Result: 1288
用法解释:在上面的示例中,我们有两个名为mul()和show()函数的函数。其中show()函数通常在main()函数中调用,同时我们以两种不同的方式调用mul()函数:
首先,我们像常规函数一样调用mul函数,即mul(23,45)并在函数调用时执行(输出:Result:1035)。
其次,我们使用defer关键字将mul()函数称为defer函数,即defer mul( 23,56),当所有周围的方法返回时,它将执行(输出:Result:1288)。
范例2:
package main
import "fmt"
// 函数
func add(a1, a2 int) int {
res := a1 + a2
fmt.Println("Result: ", res)
return 0
}
func main() {
fmt.Println("Start")
//多个延迟语句
//以LIFO顺序执行
defer fmt.Println("End")
defer add(34, 56)
defer add(10, 10)
}
输出:
Start
Result: 20
Result: 90
End
展开全部