Golang 中的 defer 关键字有什么作用?

在 Golang 中,defer 关键字用于延迟执行一个函数。
defer 的作用是:将其后的语句(通常是一个函数)延迟到当前函数即将返回时执行。

defer 的用途主要有:

  1. 资源清理:如文件关闭、解锁等。通过 defer 语句可以保证资源一定会被清理,即使发生了错误。
  2. 防止资源泄露:通过 defer 可以确保重要资源(内存、文件、数据库连接等)被释放。
  3. 实现某些操作的最终逻辑:通过 defer 可以让某个操作的最终逻辑得以执行,即使在函数中有 early return 语句。

例如:

func readFile(filename string) {
    f, err := os.Open(filename)
    if err != nil {
        return 
    }
    defer f.Close()  // 通过 defer 关闭文件

    // 其他逻辑
    // ......  
}

无论 readFile 函数中是否发生错误而 early return,文件资源 f 都会被关闭。这保证了资源不会泄露。
defer 的特点是:

  1. 语句延迟执行,但其参数会立即求值。
  2. 多个 defer 语句会以 LIFO(后进先出)的顺序执行。
  3. defer 语句在函数返回之前执行。
  4. 如果函数因 Panic 退出,defer 语句也会正常执行。

示例代码:

func testDefer() {
    fmt.Println("start")
    defer fmt.Println(1)
    defer fmt.Println(2)
    fmt.Println("end")
}

func testDefer2() {
    defer fmt.Println(1)
    defer fmt.Println(2) 
    panic("panic")
}

func main() {
    testDefer()  // 输出:start  end 2 1
    testDefer2() // 输出:1 2
}

所以,defer 语句主要用于释放资源、避免资源泄露和实现某些操作的最终逻辑。它通过延迟执行的方式来完成这些需求,这是 Golang 实现资源管理的一个重要手段。