
Golang中defer的执行时机
发布日期:2021-05-06 23:58:27
浏览次数:18
分类:精选文章
本文共 1020 字,大约阅读时间需要 3 分钟。
1.defer的执行顺序
底层是采用栈
func func1() { fmt.Println("A")}func func2() { fmt.Println("B")}func func3() { fmt.Println("C")}func main() { defer func1() defer func2() defer func3()}
输出 C B A

2.defer和return 的顺序
在Go语言的函数中return
语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer
语句执行的时机就在返回值赋值操作后,RET指令执行前。具体如下图所示:
func f1() int { x := 5 defer func() { x++ }() return x}
输出 5
f1()函数没有命名返回值。
- 返回值开辟了一块新的内存空间0x aaaaa某某,未命名。赋值为5
- 运行defer x=6 ,这里x跟返回值已经没有关系了
- ruturn 是指向0x aaaaa 这片区域的值
二.
func f1() (x int) { defer func() { x++ }() return 5}
输出 6
f1()函数命名返回值x。
-
返回值开辟了一块新的内存空间0x aaaaa,赋值为x=5
-
运行defer x=6 。同时修改了指向0x aaaaa的值
-
return 指向0x aaaaa区域的值
三.
func f1() (y int) { x := 5 defer func() { x++ }() return x}
输出 5
f1()函数命名返回值y。
-
返回值开辟了一块新的内存空间0x aaaaa,赋值为y=5
-
运行defer x=6 。
-
return 指向0x aaaaa区域的值
四 .
func f1() (x int) { defer func(x int ) { x++ }(x) return 5}
输出 5
f1()函数命名返回值x。
-
返回值开辟了一块新的内存空间0x aaaaa,赋值为x=5
-
运行defer , 通过参数传入。这里参数是新开辟的地址, 修改不了0x aaaaa下的x值
-
return 指向0x aaaaa区域的值
发表评论
最新留言
不错!
[***.144.177.141]2025年03月23日 23时46分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
.NET微信网页开发之使用微信JS-SDK调用微信扫一扫功能
2021-05-08
解决Spirng注入时名称下的红色波浪线
2021-05-08
使用mybatis-generator生成底层
2021-05-08
Android APK 重签名
2021-05-08
Mybatis【3】-- Mybatis使用工具类读取配置文件以及从属性读取DB信息
2021-05-08
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2021-05-08
Mybatis【7】-- Mybatis如何知道增删改是否成功执行?
2021-05-08
计算输入的一句英文语句中单词数
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
Mysql高可用架构(主从同步)
2021-05-08
mysql主从延迟高的原因
2021-05-08
ATS缓存数据结构
2021-05-08
glob模块
2021-05-08
6 个 Linux 运维典型问题
2021-05-08
oracle无法启动asm实例记录
2021-05-08
取消vim打开文件全是黄色方法
2021-05-08
一个系统部署多个tomcat实例
2021-05-08
HP服务器设置iLO
2021-05-08