《零基础Go语言算法实战》【题目 2-7】defer 关键字特性

《零基础Go语言算法实战》

【题目 2-7】defer 关键字特性

下面代码的输出是什么?请说明原因。

package main

import (

"fmt"

)

func main() {

deferFunc()

func deferFunc() {

defer func() { fmt.Println("value1") }()

defer func() { fmt.Println("value2") }()

defer func() { fmt.Println("value3") }()

panic(" 异常 ")

}

【解答】

value3

value2

value1

panic: 异常

说明:defer 关键字的实现与 go 关键字的实现类似,不同的是它调用的是 runtime.deferproc()

函数而不是runtime.newproc()函数。在defer出现的地方插入了指令调用 runtime.deferproc()函数,

然后在函数返回之前的地方插入指令调用 runtime.deferreturn() 函数。

goroutine 的控制结构中有一张表记录 defer,调用 runtime.deferproc() 函数时会将需要

defer 的表达式记录在表中,而在调用 runtime.deferreturn() 函数时,则会依次从 defer 表中出

栈并执行。因此,题目最后的输出顺序应该是 defer 定义顺序的倒序。panic 异常并不能终止defer 的执行。

相关推荐
爱勇宝2 小时前
淡泊名利之前,先承认我们都很焦虑
前端·后端·程序员
阿祖zu2 小时前
优雅写作:开源两个我的文章写作 Skill
程序员·openai·agent
ZzT4 小时前
怎么做才不会被 AI 替代?
人工智能·程序员
鱼鱼不愚与4 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
烬羽5 小时前
你真的理解 LLM 的"无状态"吗?从一段代码讲起
程序员
AskHarries8 小时前
把一个外部系统接成 MCP 工具
后端·程序员
threerocks9 小时前
AI编程的商业模式已经在互联网大厂跑通了
程序员·aigc·ai编程
用户526835677909 小时前
云原生落地:如何配置 Alertmanager 插件,将 Prometheus 告警直接打通至硬件声光语音终端?
程序员
用户852495071849 小时前
我跟 AI 说了名字它转头就忘,后来我手动给它加了个"记忆"
程序员
zzzzzz3109 小时前
当甲方说'logo放大的同时再缩小一点'时,我用 AI 把这个需求做出来了
javascript·css·程序员