Go言語(golang)のdefer

※当サイトではアフィリエイト広告を利用しています

目次

Go言語(golang)のdefer

deferの使い方を説明します。Tour of Goを参考にしています。

deferを使えば関数の終了時に任意の処理を実行できます。

Go言語(golang)のdeferの使い方

deferは、Golangにおいて関数の実行を遅延させるためのキーワードです。deferを使うことで、指定した処理を関数が終了する際に実行することができます。主に、リソースの解放やクリーンアップ、エラーハンドリングのために使用されます。

deferを使用すると、指定された関数呼び出しが遅延され、関数内での処理が終了した後に実行されます。以下は基本的な使用例です。

package main

import "fmt"

func main() {
    fmt.Println("処理開始")

    // 関数終了時に実行される
    defer fmt.Println("処理終了")

    // 通常の処理
    fmt.Println("メインの処理")
}

この例では、deferを使ってfmt.Println("処理終了")を関数の最後に遅延させています。実行すると、以下のような出力が得られます。

処理開始
メインの処理
処理終了

deferは複数回使用でき、遅延された関数呼び出しは後で登録されたものから逆順に実行されます。以下は複数のdeferの例です。

package main

import "fmt"

func main() {
    defer fmt.Println("最後に実行される")
    defer fmt.Println("これは後で実行される")
    fmt.Println("最初に実行される")
}

この例では、3つのfmt.Printlnが登録されていますが、deferによって最後に登録されたものから順に実行されます。出力は次のようになります。

最初に実行される
これは後で実行される
最後に実行される

deferは、ファイルのクローズやロックの解放など、遅延されたタイミングで行いたい後始末作業に便利です。

defer注意点: 遅延された関数の引数の評価

deferに渡す関数の引数は、defer文が実行される時点で評価されます。そのため、引数が関数内で変更されてしまう場合、deferに渡された関数には変更前の値が渡されることになります。

func main() {
    x := 5
    defer fmt.Println("Deferred:", x)
    x = 10
    fmt.Println("Not deferred:", x)
}

この例では、Deferred: 5Not deferred: 10が出力されます。deferに渡す関数は遅延されるため、xが変更される前の値が出力されています。

defer注意点: deferの順序

defer文はスタックで管理され、後で登録されたものから逆順に実行されます。このため、関数内で複数のdeferがある場合、適切な順序で実行されるように注意する必要があります。

func main() {
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
}

この例では、3, 2, 1の順で出力されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

テック企業でプレイングマネージャーをしている Jun です。プログラミングの基礎をはじめ、組織やマネジメントについてブログを書いています。ハードスキル、ソフトスキルどちらも磨きたい方を対象にしています。一緒に学んで人生を楽しくしていきましょう!

目次