当前位置: 首页 > article >正文

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

41e99ed79aae4148816c062e0d78db59.png

 


http://www.kler.cn/a/500568.html

相关文章:

  • Python学习(三)基础入门(数据类型、变量、条件判断、模式匹配、循环)
  • 系统思考—因果关系
  • 西电-神经网络基础与应用-复习笔记
  • 如何修改 Go 结构体的私有字段
  • spring boot 支持jsonp请求
  • 阿里云发现后门webshell,怎么处理,怎么解决?
  • React - router的使用 结合react-redux的路由守卫
  • 依赖网络系统混合级联故障下系统可靠性提高与弹性的组合优化
  • 网络安全 | Web安全常见漏洞和防护经验策略
  • 苍穹外卖及软件开发介绍
  • 基于 B2C 的网上拍卖系统:秒杀与竞价功能的实现
  • ip归属地和手机号是一个地址吗
  • 【微服务】面试 2、负载均衡
  • matlab专栏-模拟滤波器设计
  • Spring——几个常用注解
  • linux服务器安装mysql数据库和nginx
  • 多线程面试相关
  • 【python进阶——封装|继承|多态|类型注解】
  • 【软件安装】Visual Studio Code安装教程VScode安装教程
  • 下载并安装MySQL
  • 基于FFmpeg 6.x与SDL2的音视频播放器开发全解析
  • 数字孪生可视化在各个行业的应用场景
  • 数据结构·二叉树(2)
  • 【RabbitMQ】消息队列消息确认机制