技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

defer【Go】

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))
}