golangのdeferとは 使い方、注意点について解説
今回は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の案件を探すならクラウドワークス テック
deferの注意点
パニック時の挙動:
panicが発生した場合、defer文はpanicが発生した関数内でまだ実行されていない全てのdeferを実行する挙動をします。
引数の評価タイミング
deferで呼び出される関数の引数は、defer文が実行された時点で評価されます。
エラーハンドリング
deferされた関数内で発生したエラーを、呼び出し元がキャッチするのは難しいため、エラーハンドリングには注意が必要です。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。