《零基础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 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
爱勇宝3 小时前
忙不是勋章,身体才是职场人唯一的长期资产
程序员
武子康4 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
kyriewen5 小时前
我扫了 422 个仓库,近一半 CI 在裸装依赖
前端·javascript·程序员
zh_xuan6 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长6 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
致力于划水第一线6 小时前
现在矿石每天签到只送一个了吗
程序员
早起CaiCai7 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
Thneonl7 小时前
桌宠穿透不是一行 SetWindowLong
windows·程序员