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

golang的defer执行时机案例分析

package main
import "fmt"func calcFunc(x int, y int) int {return x + y
}func main() {// defer语句的执行顺序是,从右到左,逆序执行deferDemo()// deferDemo1函数demo1 := deferDemo1()fmt.Println(demo1) // 0// deferDemo2函数demo2 := deferDemo2()fmt.Println(demo2) // 1// deferDemo4demo4 := deferDemo4()fmt.Println(demo4) // 1// deferDemo5demo5 := deferDemo5()fmt.Println(demo5) // 1// deferDemo6demo6 := deferDemo6()fmt.Println(demo6) // 2// 难点解析/*分析:defer注册顺序:1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y)))2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y)))defer执行顺序:1. fmt.Println("BB", calcFunc(x, calcFunc(x, y)))2. fmt.Println("AA", calcFunc(x, calcFunc(x, y)))*/x := 1y := 2// 注册的时候 x = 1, y = 2 所以执行的时候x = 1, y = 2defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2)  // 结果是:4x = 10// 注册的时候x = 10, y = 2 所以执行的时候x = 10, y = 2defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 结果是:22y = 20}

分析:
defer语句的执行顺序是,从右到左,逆序执行
执行deferDemo()函数时,会先执行defer语句,再执行函数体,函数体执行完后,再执行defer语句
执行结果:
开启defer
结束defer
defer语句6
defer语句5
defer语句4
defer语句3
defer语句2
defer语句1

func deferDemo() {fmt.Println("开启defer")defer func() {fmt.Println("defer语句1")}()defer func() {fmt.Println("defer语句2")}()defer func() {fmt.Println("defer语句3")}()defer fmt.Println("defer语句4")defer fmt.Println("defer语句5")defer fmt.Println("defer语句6")fmt.Println("结束defer")
}

deferDemo1执行结果是 0,延迟执行

func deferDemo1() int {var a intdefer func() {a++}()return a
}

deferDemo1执行结果是1:原因返回匿名返回值a等待函数体内操作完成才会执行return

func deferDemo2() (a int) {// 步骤一先赋值//a = 0// 步骤二再执行defer语句defer func() {a++}()// 步骤三再执行函数体// 返回值a等待函数体内操作完成才会执行returnreturn a
}

deferDemo3执行结果是1: 原因返回匿名返回值a等待函数体内操作完成才会执行return

func deferDemo3() (a int) {defer func() {a++}()return a
}

deferDemo4

func deferDemo4() int {x := 1defer func(x int) {x++ // 内部x和外面x不是同一个变量}(x)return x // 1
}

deferDemo5

func deferDemo5() (x int) {x = 1defer func(x int) {x++ // 内部x和外面x不是同一个变量}(x)return x // 1
}

deferDemo6

func deferDemo6() (x int) {x = 1defer func() {x++}()return x // 2
}
http://www.lryc.cn/news/221654.html

相关文章:

  • 2.HTML中常用浏览器
  • Vue 监听store数据变化
  • 智能交通和自动驾驶技术
  • CentOS7安装部署StarRocks
  • 树形Dp 2925. 在树上执行操作以后得到的最大分数
  • 选择企业云盘?品牌推荐和评价解析
  • redis: 记录一次线上redis内存占用过大问题解决过程
  • 数据资产、数字资产、数据资源及数据资产入表
  • Docker之Centos安装
  • SQL注入漏洞:CMS布尔盲注python脚本编写
  • security
  • 了解web3,什么是web3
  • Harbor企业级Registry基础镜像仓库的详细安装使用教程(保姆级)
  • Linux系统下数据同步服务RSYNC
  • Docker介绍及其常用命令
  • SwissArmyTransformer瑞士军刀工具箱使用手册
  • unity【动画】脚本_角色动画控制器 c#
  • Java代码如何对Excel文件进行zip压缩
  • 改进YOLO系列:12.Repulsion损失函数【遮挡】
  • win11网络连接正常,但是无法正常上网
  • 硬科技企业社区“曲率引擎”品牌正式发布
  • 少儿编程 2023年9月中国电子学会图形化编程等级考试Scratch编程三级真题解析(判断题)
  • MCU常见通信总线串讲(二)—— RS232和RS485
  • LazyVim: 将 Neovim 升级为完整 IDE | 开源日报 No.67
  • 想要搭建网站帮助中心,看这一篇指南就对了!
  • 92.更新一些收藏的经验贴总结学习
  • mysql 问题解决 4
  • llama-7B、vicuna-7b-delta-v1.1和vicuna-7b-v1.3——使用体验
  • 深入理解JVM虚拟机第十九篇:JVM字节码中方法内部的结构和与局部变量表中变量槽的介绍
  • windows好玩的cmd命令