51 lines
1.0 KiB
Markdown
51 lines
1.0 KiB
Markdown
### for 循环中禁止使用defer
|
||
- 直接在 for 循环中使用 defer 很可能使得 defer 不能执行,导致内存泄露或者其他资源问题,所以应该将 defer 放到外层。
|
||
- 若确实需要使用 defer,可以将逻辑封装为一个独立函数或者使用闭包
|
||
- 错误
|
||
```go
|
||
func readFiles(files []string) {
|
||
for i:=0;i<len(files);i++{
|
||
f,err:=os.Open(files[i])
|
||
if err!=nil{
|
||
println(err.Error())
|
||
continue
|
||
}
|
||
|
||
// bug here
|
||
// 在循环中的 defer 只有在循环结束后才会执行
|
||
// 若 files 很多,会导致大量文件句柄未及时释放
|
||
defer f.Close()
|
||
|
||
bf,err:=io.ReadAll(f)
|
||
if err!=nil{
|
||
println(err.Error())
|
||
}else{
|
||
println(string(bf))
|
||
}
|
||
}
|
||
}
|
||
```
|
||
- 正确
|
||
```go
|
||
func readFiles(files []string) {
|
||
for i:=0;i<len(files);i++{
|
||
readFile(files[i])
|
||
}
|
||
}
|
||
|
||
func readFile(name string){
|
||
f,err:=os.Open(name)
|
||
if err!=nil{
|
||
println(err.Error())
|
||
return
|
||
}
|
||
defer f.Close()
|
||
bf,err:=io.ReadAll(f)
|
||
if err!=nil{
|
||
println(err.Error())
|
||
}else{
|
||
println(string(bf))
|
||
}
|
||
}
|
||
|
||
``` |