概要
Go言語の仕様をまとめる。
前回:
Go 言語仕様3(エラーハンドリング、for文、型アサーション、switch文、型スイッチ)
内容
- defer
- panic
- recover
defer
- 関数の終了時に実行する処理を登録できる。
func Defer() {
// STARTのPrint関数が実行された後に、deferで定義したENDのPrint関数が実行される
defer fmt.Println("END")
fmt.Println("START")
}
func main() {
Defer() // START END
}
- 無名関数を使えば、複数登録可能。
defer func() {
fmt.Println("A")
fmt.Println("B")
fmt.Println("C")
}()
- deferを複数定義すると、後から定義したdeferから実行される
func Defers() {
defer fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")
}
func main() {
Defers() // C B A
}
- 以下のようなリソースの開放での使用用途が多そう
func main() {
// ファイルを作成して
file, _ := os.Create("test.txt")
// Close関数の実行を登録しておいて
defer file.Close()
// ファイルに文字列を書き込む
file.Write([]byte("Golang"))
}
panic
runtime errorを発生させ、実行中のプログラムを強制的に終了させる。
なお、deferで定義しておいた処理は実行される。
以下の例だと"START"は出力されない。
func main() {
defer fmt.Println("END")
panic("PANIC")
fmt.Println("START")
}
recover
panicを使用する場合、defer + recoverで処理方法を書いておく。
recoverを使うことで、panicの内容を取得でき、プロセスの強制終了も回避できる。
func main() {
defer func() {
fmt.Println("END")
if err := recover(); err != nil {
fmt.Println("Error:", err) // Error: runtime error
}
}()
fmt.Println("START")
panic("runtime error")
}