📜  Golang 中的 Defer 关键字

📅  最后修改于: 2021-10-24 14:25:43             🧑  作者: Mango

在 Go 语言中,defer 语句会延迟函数或方法或匿名方法的执行,直到附近的函数返回。换句话说, defer函数或方法调用参数会立即求值,但在附近的函数返回之前它们不会执行。您可以使用 defer 关键字创建延迟方法、函数或匿名函数。

句法:

// Function
defer func func_name(parameter_list Type)return_type{
// Code
}

// Method
defer func (receiver Type) method_name(parameter_list){
// Code
}

defer func (parameter_list)(return_type){
// code
}()

要点:

  • 在 Go 语言中,同一程序中允许有多个 defer 语句,它们以 LIFO(后进先出)顺序执行,如示例 2 所示。
  • 在 defer 语句中,参数是在 defer 语句执行时计算的,而不是在调用时计算的。
  • Defer 语句通常用于确保文件在需要结束时关闭,或者关闭通道,或者捕获程序中的恐慌。

让我们借助一个例子来讨论这个概念:

示例 1:

Go
// Go program to illustrate the
// concept of the defer statement
package main
 
import "fmt"
 
// Functions
func mul(a1, a2 int) int {
 
    res := a1 * a2
    fmt.Println("Result: ", res)
    return 0
}
 
func show() {
    fmt.Println("Hello!, GeeksforGeeks")
}
 
// Main function
func main() {
 
    // Calling mul() function
    // Here mul function behaves
    // like a normal function
    mul(23, 45)
 
    // Calling mul()function
    // Using defer keyword
    // Here the mul() function
    // is defer function
    defer mul(23, 56)
 
    // Calling show() function
    show()
}


Go
// Go program to illustrate
// multiple defer statements, to illustrate LIFO policy
package main
 
import "fmt"
 
// Functions
func add(a1, a2 int) int {
    res := a1 + a2
    fmt.Println("Result: ", res)
    return 0
}
 
// Main function
func main() {
 
    fmt.Println("Start")
 
    // Multiple defer statements
    // Executes in LIFO order
    defer fmt.Println("End")
    defer add(34, 56)
    defer add(10, 10)
}


输出:

Result:  1035
Hello!, GeeksforGeeks
Result:  1288

说明:在上面的例子中,我们有两个名为mul()show() 的函数。在main()函数通常调用show()函数的地方, mul()函数以两种不同的方式调用:

  • 首先,我们正常调用mul函数(没有 defer 关键字),即 mul(23, 45) 并在函数时执行(输出:结果:1035)。
  • 其次,我们使用 defer 关键字将mul()函数称为 defer函数,即 defer mul(23, 56)并在所有周围方法返回时执行(Output: Result: 1288)。

示例 2:

// Go program to illustrate
// multiple defer statements, to illustrate LIFO policy
package main
 
import "fmt"
 
// Functions
func add(a1, a2 int) int {
    res := a1 + a2
    fmt.Println("Result: ", res)
    return 0
}
 
// Main function
func main() {
 
    fmt.Println("Start")
 
    // Multiple defer statements
    // Executes in LIFO order
    defer fmt.Println("End")
    defer add(34, 56)
    defer add(10, 10)
}

输出:

Start
Result:  20
Result:  90
End