MST

星途 面试题库

面试题:Go语言defer语句在复杂函数调用链中的行为分析

假设存在以下Go代码结构: ```go package main import "fmt" func func1() { defer func() { fmt.Println("defer in func1") }() func2() } func func2() { defer func() { fmt.Println("defer in func2") }() func3() } func func3() { defer func() { fmt.Println("defer in func3") }() } func main() { func1() } ``` 请详细描述程序执行过程中defer语句的执行顺序,以及如果func2函数中出现了panic,defer语句的执行情况会有什么变化?
21.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 正常执行时defer语句的执行顺序

    • main函数调用func1时,func1中的defer语句入栈,此时栈中有defer in func1
    • 接着func1调用func2func2中的defer语句入栈,此时栈中从栈顶到栈底为defer in func2defer in func1
    • 然后func2调用func3func3中的defer语句入栈,此时栈中从栈顶到栈底为defer in func3defer in func2defer in func1
    • func3执行完毕,defer in func3出栈并执行,打印defer in func3
    • func2执行完毕,defer in func2出栈并执行,打印defer in func2
    • func1执行完毕,defer in func1出栈并执行,打印defer in func1
  2. 如果func2函数中出现了panic时defer语句的执行情况

    • main函数调用func1时,func1中的defer语句入栈,此时栈中有defer in func1
    • 接着func1调用func2func2中的defer语句入栈,此时栈中从栈顶到栈底为defer in func2defer in func1
    • func2中出现panic时,func2中剩余的代码不再执行,func2中的defer语句出栈并执行,打印defer in func2
    • 然后控制权会返回到func1func1中的defer语句出栈并执行,打印defer in func1
    • 由于panic没有被捕获,程序会终止并输出panic信息。