ステートメントを延期する
元のリンク: Go 言語に基づく関数 | Li Wenzhou のブログ
defer は、後続のステートメントの処理を遅らせることです。
重要: defer が遅延する関数を登録する場合、関数のすべてのパラメーターの値を決定する必要があります。
例えば:
func Defer() {
defer fmt.Println(1)
defer fmt.Println(2)
fmt.Println(3)
defer fmt.Println(4)
}
//output
3
4
2
1
Go 言語の関数では、return
ステートメントは最下位レベルのアトミックな操作ではなく、戻り値の代入と RET 命令の 2 つのステップに分かれています。defer
ステートメントの実行タイミングは、戻り値代入演算後、RET 命令実行前です。詳細を次の図に示します。
いくつかの組み込み関数
パニック/回復
エラー報告の設定にはpanicを使用します。エラーが発生すると思われる場所にpanicを設定できます。
例:
func Panic() {
fmt.Println("A")
panic("B")
fmt.Println("C")
}
//output
A
panic: B
goroutine 1 [running]:
study/neizhihanshu.Panic()
D:/Project/GoLang/go_study/neizhihanshu/nzhs.go:17 +0x65
main.main()
D:/Project/GoLang/go_study/main.go:87 +0x17
进程 已完成,退出代码为 2
リカバリーによりプログラムを復元できます。
func Recover() {
fmt.Println("A")
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
panic("B")
fmt.Println("C")
}
//output
A
B
进程 已完成,退出代码为 0
リカバリはパニックの前にエラーをインターセプトすることしかできませんが、後でエラーを防ぐことはできません。
func Recover() {
fmt.Println("A")
panic("B")
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
fmt.Println("C")
}
//output
A
panic: B
goroutine 1 [running]:
study/neizhihanshu.Recover()
D:/Project/GoLang/go_study/neizhihanshu/nzhs.go:27 +0x6a
main.main()
D:/Project/GoLang/go_study/main.go:87 +0x17
进程 已完成,退出代码为 2