Go言語のdeferでファイルリソースをクローズする
この間、Goでファイルを読み書きするサンプルを書いてみたけど、そういえばCloseとか何もしてなかった。
調べてみるとFileオブジェクトにCloseメソッドがあって、deferで呼ぶと関数の一番最後に実行してくれるらしい。
Effective Go - The Go Programming Language
package main import ( "bufio" "flag" "io" "os" ) func main() { flag.Parse() var reader *bufio.Reader var writer *bufio.Writer read_file, _ := os.OpenFile(flag.Arg(0), os.O_RDONLY, 0600) defer read_file.Close() reader = bufio.NewReader(read_file) write_file, _ := os.OpenFile(flag.Arg(1), os.O_WRONLY|os.O_CREATE, 0600) defer write_file.Close() writer = bufio.NewWriter(write_file) for { line, err := reader.ReadBytes('\n') if err == io.EOF { return } writer.Write(line) writer.Flush() } }
deferをもう少し試してみる
deferに渡した処理はLIFOで処理される
以下を実行すると3、2、1、0の順で出力される
package main import ( "fmt" ) func main() { for i := 0; i <= 3; i++ { defer fmt.Println(i) } }
以下はreturnのあとにdeferに渡した即時関数(のようなもの?)が実行されて1が返される
package main import ( "fmt" ) func main() { fmt.Println(f()) } func f() (result int) { defer func() { result++ }() return 0 }