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

相关推荐
地平线开发者12 分钟前
J6B vio scenario sample
算法
BothSavage12 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn12 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
纯爱掌门人13 小时前
干了这么多年前端,聊聊 2026 年我们到底还值不值钱
前端·程序员
AskHarries13 小时前
用 OpenClaw 做一份完整 PPT:从主题、提纲到 slide deck
后端·程序员
齐翊13 小时前
分享一个在 Claude Code 里 [同时] 用多个 ApiKey 的方法
程序员·github·agent
烬羽14 小时前
从"抽卡"到"搭台":一文讲透上下文工程(Context Engineering)的底层逻辑
程序员
烬羽14 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
SimonKing14 小时前
Google第三方授权登录
java·后端·程序员