《零基础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 的执行。

相关推荐
啦啦啦啦啦zzzz7 小时前
贪心算法和动态规划
c++·算法·贪心算法·动态规划
happyprince8 小时前
篇3:bitsandbytes-深刻观-哲学与升华
人工智能·算法
应用市场8 小时前
红绿灯背后的算法:从 Webster 配时到 Max-Pressure 与强化学习
算法
木井巳8 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
Hilaku8 小时前
前端真的比后端简单吗?
前端·javascript·程序员
程序员cxuan8 小时前
Codex 接入 DeepSeek-V4-Flash,丝滑的一批
人工智能·后端·程序员
CodeSheep9 小时前
hvv员工家属爆料:老公22年入职的,普通员工,老是被误以为高薪多奖金,实际上还没配股,暂时钱没存多少,我倒是很心疼他工作辛苦。
前端·后端·程序员
June`10 小时前
常量内存和只读缓存
c++·人工智能·算法·cuda
一条大祥脚10 小时前
ABC468 扫描线|贡献法|二阶差分|线段树优化DP
数据结构·算法
happyprince10 小时前
篇2-bitsandbytes-具体观-算法与实现剖析
算法