LoginSignup
0
1

More than 3 years have passed since last update.

Go 言語仕様4(defer, panic, recover)

Last updated at Posted at 2021-02-13

概要

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")
}

次回

Go 言語仕様5(スライス、マップ)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1