今回はgolangにおけるdeferについて解説していきます。
目次
deferとは
defer文は制御構文の一種で、defer文の処理は関数の最後に実施する挙動をします。
関数においてはreturnされたり、最後の行まで進むと処理が終わりますが、その処理が全て終わる前にdefer文が動くということになります。
deferの使い方
説明されるよりも実際のコードと動きを見るのが早いかもしれませんね。
例えば簡単に以下のように書くと、先に文字列1を出力するPrintln関数が動き、その後にdefer文に記載されている文字列2を出力するPrintln関数が動きます。
func main() {
defer fmt.Println("2")
fmt.Println("1")
}
defer文を使うことでdefer文の処理は後続の処理よりも後に実行されているということになります。このdefer文はリソースの解放を行う際に使われることが多いです。
func main() {
c.err := newDbClient(ctx)
defer c.Close()
~~~~
}
上記のようにDBのクライアントを作成した後にdeferを使うことで可読性高く、クライアントのクローズ処理を書いておくことができます。
deferが複数ある場合の挙動
注意しておきたいのでdefer文が複数宣言されている場合の挙動です。
func main() {
defer fmt.Println("4")
fmt.Println("1")
defer fmt.Println("3")
fmt.Println("2")
}
この実行結果は1→2→3→4の順で出力されます。
deferが複数宣言されている場合は宣言している順番と逆順で実行されています。for文やif文の中にdeferが書かれていることで処理順がややこしくなりますが、宣言とは逆順に実行されると覚えておくと、こんがらがなくなります。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。
【入門】golangの学習におすすめの本/書籍7選
これから業務でgolangを使うことになった方、これからgolangを使ってキャリアを歩んでいきたいという方でどのように学習していこうか悩んでいる方もいるかと思います。 ...