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

相关推荐
6Hzlia10 分钟前
【Hot 100 刷题计划】 LeetCode 394. 字符串解码 | C++ 单栈回压法
c++·算法·leetcode
阿祖zu12 分钟前
ZuSpaceX 赛博像素风个人主站开源
程序员·aigc
穿条秋裤到处跑36 分钟前
每日一道leetcode(2026.04.22):距离字典两次编辑以内的单词
算法·leetcode
淘矿人36 分钟前
Claude辅助算法设计与优化
人工智能·python·算法·microsoft·github·bug·pygame
流年如夢38 分钟前
自定义类型进阶:联合与枚举
java·c语言·开发语言·数据结构·数据库·c++·算法
wayz1140 分钟前
Day 10:集成学习进阶(Boosting: AdaBoost, GBDT)
算法·机器学习·集成学习·boosting
Little At Air42 分钟前
C++stack模拟实现
linux·开发语言·c++·算法
张祥6422889041 小时前
导数与微分有啥区别
算法·数学建模
葳_人生_蕤1 小时前
hot100——图
数据结构·算法
Rust研习社1 小时前
深入浅出 Rust 泛型:从入门到实战
开发语言·后端·算法·rust