【GoLang基础】defer关键字有什么作用?

时间:2025-03-30 16:36:41

问题引出:

Go语言中的defer关键字有什么作用?

解答:

defer 是 Go 语言中的一个关键字,用于延迟(defer)函数的执行直到包含 defer 的函数执行完毕。defer 通常用于在函数执行完成后执行一些清理或收尾工作。它的作用包括以下几个方面:

  1. 延迟执行: 使用 defer 关键字可以延迟一个函数的执行直到包含 defer 的函数执行完毕。这意味着无论函数是正常返回还是发生了 panic,被 defer 延迟执行的函数都会在最后被执行。
  2. 清理资源: defer 常用于释放资源,例如关闭文件、关闭数据库连接、解锁资源等。通过在函数开头打开资源,在函数结尾使用 defer 来关闭资源,可以确保资源在函数执行完毕后被正确释放,避免资源泄露。
func processFile(filename string) error {
    f, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer f.Close() // 确保文件在函数执行完毕后被关闭

    // 处理文件的逻辑

    return nil
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 函数调用顺序: 多个 defer 语句按照后进先出(LIFO)的顺序执行,即最后一个被延迟的函数会最先执行,依次类推。
func foo() {
    defer fmt.Println("first")
    defer fmt.Println("second")
    defer fmt.Println("third")
}

// 输出顺序为:third, second, first
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 参数值的延迟计算: defer 执行时,会立即对参数进行计算,但是函数调用被推迟到包含 defer 的函数执行结束时。这意味着参数的值在 defer 执行时已经确定。
func foo() {
    i := 0
    defer fmt.Println(i) // 输出 0,而不是延迟后的值
    i++
}

// 输出结果为 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

小结:

总之,defer 关键字是 Go 语言中用于延迟执行函数清理资源确保代码块结束时执行特定逻辑的有用工具。