package main

import (
	"fmt"
	"os"
	"runtime"
)

func main() {

	// 当发生 panic时,会立即执行该GorouTime的defer函数,
	// 然后程序崩溃, 并输出日志信息
	// 日志信息包括panic的文字描述, 函数名, 报错行号, 堆栈信息

	// 勤奋的程序员认为任何崩溃都表明代码中存在漏洞，
	// 所以对于大部分漏洞，我们应该使用Go提供的错误机制，
	// 而不是panic，尽量避免程序的崩溃。

	defer printStack()
	f(3)
}
func printStack() {
	var buf [4096]byte
	n := runtime.Stack(buf[:], false)
	os.Stdout.Write(buf[:n])
}
func f(x int) {
	fmt.Printf("f(%d)\n", x+0/x) // panics if x == 0
	defer fmt.Printf("defer %d\n", x)
	f(x - 1)
}
