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
}