Skip to content

Latest commit

 

History

History
84 lines (61 loc) · 1.38 KB

README.md

File metadata and controls

84 lines (61 loc) · 1.38 KB

Go 每日一题

今日(2023-05-01)的题目如下

下面这段代码输出的内容

package main

import (
    "fmt"
)

func main() {
    defer_call()
}

func defer_call() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()

    panic("触发异常")
}
🔑 答案解析:
打印后
打印中
打印前
panic: 触发异常

解析:defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行 panic。


7 楼

mark 当出现 panic 时,也会执行 defer。

20 楼

defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行 panic。

36 楼

哈哈哈,可以这么变化下,感觉会误导很多人:

package main

import "fmt"

func defer_call() {
    defer func() {
        if p := recover(); p != nil {
            fmt.Println(p)
        }
    }()
    defer func() {
        fmt.Println("打印前")
    }()
    defer func() {
        fmt.Println("打印中")
    }()
    defer func() {
        fmt.Println("打印后")
    }()

    panic("触发异常")
}

func main() {
    defer_call()
}