Go言語のdefer,panic,recoverについて

Go言語defer-panic-recoverについて Go

defer文は、上位ブロックの関数がreturnするまで関数の実行を遅延させる。
遅延実行される関数の引数は即時評価されるが、関数の実行は上位ブロックの関数がreturnするまで実行されない。defer文は以下の二つルールがあります。

引数の即時評価

defer文を使って、遅延実行ができますが、変数を使うとき、実行のところの値で使います。
ソースコードで確認しましょう。

package main

import "fmt"

func main() {
i := 0
defer fmt.Printf("1回目のi=%d\n",i)
i++
fmt.Printf("2回目のi=%d\n",i)
}

結果:

2回目のi=1
1回目のi=0

先定義後実行

deferを連続して宣言する場合、先に宣言したdefer文は後で実行される。
コードで確認しましょう。

package main

import "fmt"

func main() {
for i := 0; i < 4; i++ {
defer fmt.Println(i)
}
}

結果:

3
2
1
0

panicについて

panicとはプログラムの継続的な実行が難しく、どうしよもなくなった時にプログラムを強制的に終了させるために発生するエラーです。
panicで異常を発生させた場合、プログラム終了前に、defer定義した内容が実行されます。

recoverについて

 panic() 関数が呼ばれた場合には recover() 関数を使ってその内容を取得できる。

defer,panic,recover使い方

package main

import "fmt"

func main(){

defer func() {
fmt.Println("start defer 1")
if err:=recover(); err!=nil {
fmt.Println("defer error")
}
fmt.Println("start defer 2")
}()
fns()
}

func fns(){
fmt.Println("start fns 1")
panic("error")
fmt.Println("start fns 2")
fmt.Println("start fns 3")
}

結果:

start fns 1
start defer 1
defer error
start defer 2

コメント

タイトルとURLをコピーしました