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

相关推荐
颜酱21 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
文心快码BaiduComate21 小时前
Comate 4.0新年全面焕新!底层重构、七大升级、复杂任务驾驭力跃升
前端·程序员·架构
程序员鱼皮1 天前
微软竟然出了免费的 AI 应用开发课?!我已经学上了
人工智能·程序员·ai编程
炫饭第一名1 天前
速通Canvas指北🦮——路径与形状篇
前端·javascript·程序员
aristotle1 天前
Openclow安装保姆级教程
人工智能·程序员
Lee川1 天前
从零构建AI对话应用:Vite脚手架搭建与API密钥安全实践
前端·程序员
qianpeng8971 天前
水声匹配场定位原理及实验
算法
SimonKing1 天前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法