【Go言語】我慢我慢で最後にドーン! – Defer

2018年12月11日Godefer,Go言語,制御文Go,defer,Go言語,制御文

WordPressのバージョンが5.0になり、新エディタが実装されました。

新しくなる事自体は嬉しいんですが、今までの操作感とだいぶ違っているので、なかなか馴染めないでいます。(^_^;)

さて、今回もタイトルは適当ですが、久しぶりに Go 言語を進めてみます。

そして今進めている「Flow control statements: for, if, else, switch and defer」の章ですが、今回で最後となります。

該当ページはこちら

今回進めるページはこちらですね。

「Defer」ハコチラ>(´・ω・)つ https://go-tour-jp.appspot.com/flowcontrol/12

「Stacking defers」ハコチラ>(´・ω・)つ https://go-tour-jp.appspot.com/flowcontrol/13

Deferは2ページまとめて進めちゃいます。

今回はDeferをお勉強

個人的には見慣れないキーワードなんですが、Go特有なんでしょうかね?

Deferの働きとしては、Deferに指定した関数の実行を、そのDeferが呼ばれた関数の最後(returnのタイミング)まで遅延させる、という説明になってます。

と書いては見ましたが、いまいち掴みにくいのでこのあと実際に動かしてみようと思います。

続いては、ポイントを絞って詳細を見ていきます。

ポイントを抜き出す

今回のポイントはこんな感じでしょうか。

  • Deferの書き方
  • スタック(stack)について

Deferの書き方

まずは書き方から。

defer <ファンクション>

書き方自体は簡単ですね。

ちなみに、ちゃんとした書き方のルールは言語仕様の方に記載があります。

続いては実際にDeferを使いまして、適当なプログラムを書いてみます。

もちろんプログラムに意味はありません。_(:3」∠)_

スタック(stack)について

複数回 defer を使った場合は一旦スタックされ、LIFO(last in first out)、つまり後入れ先出しで実行されるようです。

わかりにくいかもしれませんが、こんなイメージのようです。

スタックされた関数の実行順序
スタックされた関数の実行順序

それと、スタックされた関数の実行タイミングですが、メイン関数の最後というわけでななく、deferが呼び出された関数の最後(return)で実行されるという点に気をつけたいですね。

例えば簡単なプログラムで順番を確認してみるとわかると思います。

今回のまとめ

私が作ったサンプルプログラムは流石に適当すぎですが、Goのブログで紹介されている使い方としては、ファイルのクローズや例外処理(かな?panic系のやつですね)に適用したサンプルプログラムが紹介されていました。

それじゃ今回のまとめです。

  • defer に渡した関数は defer を呼び出した関数の最後で実行されるんです
  • defer の書き方は defer <ファンクション> と書くんです
  • 複数の defer でスタックされたときは LIFO の順で実行されるんです

こんなところでしょうか。

そして今回で制御系の章は終了となります。

次回からは「More types: structs, slices, and maps.」の賞を進める予定です。

それじゃ~また次回。٩(๑´3`๑)۶