1. package main
    2. import "fmt"
    3. func main() {
    4. defer func() {
    5. fmt.Println("defer start")
    6. if err := recover(); err != nil {
    7. fmt.Println(err)
    8. }
    9. fmt.Println("defer end")
    10. }()
    11. A()
    12. B()
    13. C()
    14. fmt.Println("main end")
    15. }
    16. func A() {
    17. defer fmt.Println("A 1")
    18. defer fmt.Println("A 2")
    19. fmt.Println("A 3")
    20. return
    21. fmt.Println("A 4")
    22. defer fmt.Println("A 5")
    23. }
    24. func B() {
    25. fmt.Println("B 1")
    26. panic("now is panic!")
    27. fmt.Println("B 2")
    28. }
    29. func C() {
    30. fmt.Println("C 1")
    31. }

    最后的总结

    • 函数内部defer执行顺序先进后出
    • return后defer等不生效
    • 捕捉panic后不向下执行程序,main函数退出