在 Golang 中,defer 关键字用于延迟执行一个函数。
defer 的作用是:将其后的语句(通常是一个函数)延迟到当前函数即将返回时执行。
defer 的用途主要有:
- 资源清理:如文件关闭、解锁等。通过 defer 语句可以保证资源一定会被清理,即使发生了错误。
- 防止资源泄露:通过 defer 可以确保重要资源(内存、文件、数据库连接等)被释放。
- 实现某些操作的最终逻辑:通过 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 的特点是:
- 语句延迟执行,但其参数会立即求值。
- 多个 defer 语句会以 LIFO(后进先出)的顺序执行。
- defer 语句在函数返回之前执行。
- 如果函数因 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 实现资源管理的一个重要手段。