// 错误示例:defer在循环结束后统一执行 for i := 0; i < 5; i++ { file, _ := os.Open(fmt.Sprintf("file%d.txt", i)) defer file.Close() // 所有文件在循环结束后关闭! }
// 正确示例:使用匿名函数立即释放资源 for i := 0; i < 5; i++ { func() { file, _ := os.Open(fmt.Sprintf("file%d.txt", i)) defer file.Close() // 每次循环结束时关闭文件 }() }
6. 与recover()结合处理 panic
defer常用于恢复panic,防止程序崩溃:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
funcsafeCall() { deferfunc() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() // 可能触发panic的操作 panic("something went wrong") }