在 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