- 在Go语言中,defer语句用于延迟执行一个函数,直到包含该defer语句的函数执行完毕。
示例:
package main
import (
"fmt"
"os"
)
func main() {
// 1. 打开文件
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
=========================================
func slowFunction() {
// 在函数开始时记录时间
start := time.Now()
// 用 defer 在函数退出时自动计算耗时
defer func() {
fmt.Printf("函数执行耗时: %v\n", time.Since(start))
}()
// 模拟耗时操作
time.Sleep(2 * time.Second)
}
// 2. 延迟执行:确保文件一定会被关闭!
defer file.Close()
// 3. 读取文件内容(示例)
data := make([]byte, 100)
count, err := file.Read(data)
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
fmt.Printf("读取了 %d 字节: %s\n", count, string(data[:count]))
// 4. 此处函数结束,自动执行 defer file.Close()
}
- 执行defer语句的执行顺序是后进先出(LIFO),即最后一个defer语句最先执行。多个
defer按逆序执行
示例:
func example1() {
fmt.Println("开始")
defer fmt.Println("延迟执行") // 这行最后执行
fmt.Println("结束")
// 输出:
// 开始
// 结束
// 延迟执行
}
defer的函数参数在声明时就被计算并固定
示例:
func example3() {
x := 10
defer fmt.Println("x =", x) // 此时 x=10 已被固定
x = 20
// 输出:x = 10
}