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

相关推荐
武子康3 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
易师傅3 小时前
技术面试已死?AI 时代,真正拉开程序员差距的是什么?
前端·后端·程序员
Hilaku7 小时前
你们公司有 35 岁以上的前端吗?
前端·javascript·程序员
AI前端工程狮7 小时前
服务端已经死了,客户端却报"超时"
人工智能·程序员
楠风测开8 小时前
两个任务同时跑,B 的登录态为什么被踢回登录页
程序员
codigger8 小时前
大厂git提交规范
git·程序员
lisw059 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
挖掘狂人9 小时前
六条分支,一条主干:我的 Git 分支管理心得
git·后端·程序员
程序员cxuan9 小时前
再见了 Typora
人工智能·后端·程序员
一起学安全技术9 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer