Go言語

【Go Blogを読む】Defer, Panic, and Recover

どうも、スタディサプリ ENGLISHでTOIECに向けて英語学習のヨノです。スタディサプリ ENGLISHだけでも十分なのですが、プログラマーとしての学習もしなければということで、Go Blog を読むことにしました。

英語の長文を読みつつ、Go言語に詳しくなれるので一石二鳥!!笑

せっかく読むので要点をまとめていきます。

今回は、「Defer, Panic, and Recover

defer

defer文は関数呼び出しをリストにPUSHし、PUSHされた関数はdeferを囲っている関数がreturnした後に実行される。クリーンアップ処理を行う関数を簡略化するのに使われるのが一般的。

ポイント

  1. deferに渡した関数(遅延された関数)の引数は、defer 文が評価されたときに評価される

    func a() {
        i := 0
        defer fmt.Println(i) // => 0
        i++
        return
    }
  2. LIFO(Last In First Out)で実行される
  3. defer に渡した関数(遅延された関数)はnamed return value読み取り、割り当て可能

    func c() (i int) {
    	defer func() { i++ }()
    	return 1 // deferで+1されるので「2」が返る
    }

 

panic

panicは通常の制御フローを停止して、panickingを開始する組み込み関数。

  1. 関数Fがpanicを呼び出したとき、関数Fの実行を停止し、関数F内でdeferに渡した関数(遅延関数)が実行される。
  2. Fは呼び出し元に戻る。
  3. プロセスは現在のゴルーチン内のすべての関数が戻るまでスタックを上っていき、すべて戻るとプログラムはクラッシュ。

パニックはpanicを直接呼び出すかランタイムエラーで引き起こされる。

 

recover

recoverはパニックしたゴルーチン制御を回復する関数。

ポイント

  1. recoverはdeferに渡す関数内でのみ使える
  2. 正常実行の間は、recovernilを返し、何もしない
  3. ゴルーチンがパニックを起こしたときにrecoverを呼び出すと、panicに与えられた値を捕捉し、正常実行を再開します。
    go blogのサンプルコードがとてもわかりやすいので見てください。

例えば、Goの標準ライブラリである json package encode.go にあるencodeStateerrormarshalメソッドで使われている。

パッケージが内部でpanicを使う場合でも、外部APIでは明示的なエラーを返すのがGoライブラリの慣習(規則)。

 

 

おすすめ図書

Tour of Goを終えた人にオススメです!!

-Go言語

© 2021 フリエン生活 Powered by AFFINGER5