• Goのランタイムが次に何をすれば良いか判断できない時にpanicが生成される
    • 例えば、スライスの終わりを超えて読み込もうとしたり、makeの引数に負の数字を指定したりするケース
  • ガベージコレクターの誤動作やランタイム自体のバグを検出した時もpanicになるが、「ランタイムに原因がある」場合は非常に稀なので最後に考える
  • panicがなった時は第一に「プログラミングのエラーが原因である」ことを疑う
  • recoverは何が失敗したのかを明示してくれず、メッセージを出力して継続できるだけなので、できる限りpanicrecoverに依存しないコードを書くよう心がける
  • panicrecoverの実装例
package main
 
import (
	"fmt"
)
 
func div60(i int) {
	defer func() {
		if v := recover(); v != nil {
			fmt.Println(v)
		}
	}()
	fmt.Println(60 / i)
	// 60
	// 30
	// runtime error: integer divide by zero
	// 10
}
 
func main() {
	for _, val := range []int{1, 2, 0, 6} {
		div60(val)
	}
}