Golangでファイルを開いて閉じるとき、だいたいの場合はこのように書きます。

func main(){}
    file, err := os.Open("/path/to/file")
    defer file.Close()
}

こうしておくと、自身が属するメソッドが終了する際に、一緒に閉じてくれます。 この例で行くと main ですね。 なので、複数ファイルを開くときも同じような感じで

func main() {}
    for i:=0; i<100; i++ {}
        file, err := os.Open("/path/to/file")
        defer file.Close()
    }
}

と書きがちです。何か問題でも? ファイルが少ない内は問題ないのですが、下記リンク先の様にある一定数を超える回数をループすると https://play.golang.org/p/FUxEJaRwO4

panic: open .: too many open files

おお、、開きすぎたZEとなります。 これは、前述した通り、main() が終了するまで、オープンされたものが閉じないからです。

なら、どうかけば。。ええねん

package main

import (
    "os"
    "log"
)

func main() {
    var files []string

    for i := 0; i < 167757; i++ {   
        file := func() string {

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

            return file.Name()
        }()

        files = append(files, file)
    }   
    log.Println(len(files))

}

https://play.golang.org/p/eePKDL0kNa

このように関数化してしまえば解決です。例では無名関数化してますが ただ、無名関数化する事で、今までのように変数を使う事ができなくなるので、そこは気をつけなければ

これは、今書いてるbackup toolというのか? https://github.com/shinofara/stand/pull/55 を書いてる時に発生したので、早めに気付いてよかったです。

参考

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