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

相关推荐
自信150413057597 分钟前
选择排序算法
c语言·数据结构·算法·排序算法
2401_873544928 分钟前
基于C++的游戏引擎开发
开发语言·c++·算法
add45a9 分钟前
C++中的组合模式
开发语言·c++·算法
無限進步D10 分钟前
简单贪心算法 cpp
c++·算法·贪心算法·蓝桥杯·入门·竞赛
2501_9454235413 分钟前
模板编程中的SFINAE技巧
开发语言·c++·算法
IT老小子13 分钟前
【c 语言】linux下gcc编译工具的使用
程序员
AMoon丶13 分钟前
Golang--垃圾回收
java·linux·开发语言·jvm·后端·算法·golang
承渊政道14 分钟前
【优选算法】(实战感悟二分查找算法的思想原理)
c++·笔记·学习·算法·leetcode·visual studio code
☆56615 分钟前
C++中的策略模式应用
开发语言·c++·算法
2401_8845632416 分钟前
C++中的原型模式变体
开发语言·c++·算法