deferは、処理の実行を遅らせます。
func greet() {
fmt.Println("よろしくお願いします。")
}
func main() {
defer greet()
fmt.Println("マイケルです。") // マイケルです。\nよろしくお願いします。
}
deferがつけられた処理は、その関数の全ての処理が終了した後に実行されます。
deferが関数内に複数ある場合には、下から順に実行されます。
func greet() {
fmt.Println("よろしくお願いします。")
}
func main() {
defer greet()
fmt.Println("マイケルです。")
defer fmt.Print("Japan.")
defer fmt.Print("from ")
defer fmt.Print("I'm ") // マイケルです。\n I'm from Japan.よろしくお願いします。
}
ファイルの読み込み処理の際に便利です。
ファイルをオープンし、処理が完了したら閉じる必要がありますが、
deferを用いて、オープン処理の直後に記述すれば、関数内の処理が完了した後に閉じる事ができます。
ファイルの閉じ忘れをせずに済むのです。
func main() {
file, _ := os.Open("./hello.go")
defer file.Close() // main関数内の全ての処理が完了したら、ファイルを閉じる
data := make([]byte, 300)
file.Read(data) // fileの読み込み内容をdataに格納
fmt.Println(string(data))
}