Edited at

Golangのos.Openはfor文の中に書く場合、deferで閉じてははいけない

More than 3 years have passed since last update.

package main

import (
"os"
)

func main() {

for i := 0; i < 67757; i++ {
file, err := os.Open(".")
if err != nil {
panic(err)
}
defer file.Close()
}
}

この様にある一定数を超えると

panic: open .: too many open files となります。

実行例 https://play.golang.org/p/FUxEJaRwO4

※PlayGroundの制限でメッセージは違います

解決案としては、1例として

for i := 0; i < 167757; i++ {   

func() {
file, err := os.Open(".")
if err != nil {
panic(err)
}
defer file.Close()
}()
}

こういうふうに無名関数化すると、解決します。


原因は何かと言うと、defer が実行されるタイミングと、ファイルを開ける限界数です。

実行例 https://play.golang.org/p/eePKDL0kNa

必要な部分を抽出して此処に書きましたが


どうでもいいこと含めた内容は別に書いてますー。


参考

http://mattn.kaoriya.net/software/lang/go/20151212021608.htm