package main

import (
"fmt"
"time"
)

func main() {
f()
fmt.Println("main end")
}

/*
1.多个defer 执行,最先定义的在栈底,最后定义的在栈顶,所有最后定义的最先执行
2.定义的defer里面的panic ,可以被它之前定义的recover捕获
3.recover 定义在defer func(){}() 函数中会被执行
*/
func f() {
defer func() {
fmt.Println("defer2 start")
if err := recover(); err != nil {
fmt.Println(err)
}
fmt.Println("defer2 end")
}()
defer func() {
fmt.Println("defer1 start")
if err := recover(); err != nil {
panic(err)
}
fmt.Println("defer1 end")
}()

for {
fmt.Println("func begin")
a := []string{"c", "c"}
fmt.Println(a[3])
fmt.Println("func end")
time.Sleep(1 * time.Second)
}
}