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

相关推荐
kse_music4 分钟前
常用的排序算法(Java版)
java·算法·排序算法
杨十一115 分钟前
LeetCode热题100(二十六) —— 142.环形链表II
算法·leetcode·链表
xiaoshiguang36 分钟前
LeetCode:216.组合总和III
java·算法·leetcode
陵易居士38 分钟前
排序算法(归并排序、快速排序)
数据结构·算法·排序算法
Daisy_JuJuJu1 小时前
聚类系列 (二)——HDBSCAN算法详解
算法·数据挖掘·聚类·dbscan·密度聚类·hdbscan·optics
呆头呆脑~1 小时前
逆向 易九批 最新版 爬虫逆向 x-sign ......
javascript·爬虫·python·算法·网络爬虫
贫道绝缘子1 小时前
LeetCode-493. Reverse Pairs
算法·leetcode·职场和发展
陌然。。2 小时前
【39. 组合总和 中等】
数据结构·c++·笔记·算法·leetcode
BagMM2 小时前
似然函数,最大似然函数理解
算法·概率论
z樾2 小时前
回溯专题 记录
数据结构·算法·leetcode