📌  相关文章
📜  go defer - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:15:21.198000             🧑  作者: Mango

Go语言中的defer关键字

在Go语言中,defer是一种用于延迟函数调用的机制。当函数包含defer语句时,被延迟的函数调用将立即被注册并推迟到外层函数返回前执行。本文将介绍defer的基本用法和相关注意事项。

基本语法

defer语句通常被放置在函数中,在函数返回时执行,语法如下:

defer function_name()

其中function_name为要被推迟的函数名。在函数返回前,defer语句传递的参数将被计算并保存。当函数完成后,被推迟的函数将按照LIFO(Last In First Out)的顺序执行。

func main() {
    defer fmt.Println("Hello")
    fmt.Println("World")
}

输出:

World
Hello

在这个例子中,Hello函数被推迟到外层函数的返回前执行,故先输出World,后输出Hello

defer的注意事项
  • defer语句可以注册多个函数调用,它们将按照被定义的顺序执行,返回时也是LIFO顺序执行。
  • defer语句中的函数参数在注册时被计算,但是要在推迟执行时才真正被调用,这可能会在一些场景下产生一些错误。
  • 在循环中使用defer语句时应尤其小心。在执行defer语句时,循环变量已经被修改,因此要避免对循环变量的访问。
  • 栈的大小是有限的,因此在递归中使用defer语句时应尤其注意防止栈溢出。
示例
package main

import "fmt"

func main() {
    fmt.Println("Counting...")
    for i := 0; i < 10; i++ {
        defer fmt.Println(i)
    }
    fmt.Println("Done.")
}

输出:

Counting...
Done.
9
8
7
6
5
4
3
2
1
0

这个例子中,defer语句将多个fmt.Println函数推迟到Done函数返回前执行。最终被推迟的函数将按照LIFO顺序执行,因此输出结果是倒序的。

总结

Go语言中的defer语句提供了一种方便的方式来规划函数的执行顺序,尤其是在处理资源分配和释放时。在使用defer时应留意处理函数参数、循环变量和递归调用等情况,并避免过度使用以避免出现不必要的栈溢出。