[Golang] Possible resource leak, 'defer' is called in the 'for' loop
||
本文共375字。
Copyright: 知识共享署名 非商业性使用 相同方式共享 4.0 国际许可协议
|
CC BY-NC-SA 4.0
今天被goland警告在golang的for循环中使用defer可能会导致资源泄漏,主要是因为defer
的作用域是一个函数,不是一个语句块。
测试如下:
1 | func main() { |
输出为
1 | before: 0 |
defer并不会在一次for循环执行完成后执行defer,而是会在整个函数体执行完成后执行defer。且defer的执行顺序为先进后出,类似堆栈。
解决方法:
将defer放在函数中执行。如下:
1 | func main() { |
注意,要点在于不能使defer关键字出现在for循环中。使用匿名函数依然不可行,如下:
1 | // 所有defer会在main()执行完毕后再执行 |
匿名函数更不可以写成如下方式:
1 | // 所有defer会在main()执行完毕后再执行,且均输出defer: 3 |
完毕。