Go の recover、知らない概念だった。

開発環境

> go version
go version go1.16.3 linux/amd64

recover

recover を検索すると、defer, panic と共に説明されることが多い。

defer は普段使用している Swift に存在し、 panic も触った感じ fatalError と同じような挙動をするため、漠然とは理解していたが、recover は初めての概念だったので調べた。

Recover is a built-in function that regains control of a panicking goroutine. Recover is only useful inside deferred functions. During normal execution, a call to recover will return nil and have no other effect. If the current goroutine is panicking, a call to recover will capture the value given to panic and resume normal execution.
Defer, Panic, and Recover - The Go Blog

  • panic な goroutine の制御を取り戻す
  • defer 内のみ有効
  • panic な goroutine 内で recover を使うと、recover の呼び出し時に panic 時に与えた値をキャプチャする

 

package main

import "log"

func f() {
	defer func() {
		if r := recover(); r != nil {
			log.Println("Recoverd in f", r)
		}
	}()
	panic("Panic!")
}

func main() {
	f()
}

 

> go run main.go
2021/05/23 01:00:31 Recoverd in f Panic!

panic 時に与えた値が recover にキャプチャされていることが分かった。

参考