学习于https://www.liwenzhou.com/posts/Go/function/的文章

1. defer的执行顺序类似于栈,“后进先出”,也就是最先defer的语句最后执行,而最后defer的最先执行

func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
} //控制台打印
3
2
1

2. defer和return的坑

首先return操作并不是原子操作,他分为2步:一是给返回值赋值,二是return返回值。如果函数中有defer的话,那么defer会被夹杂在2步中间,也就是先给返回值赋值,执行defer,return返回值

func main() {
fmt.Println("匿名返回:", a()) //5
fmt.Println("有名返回:", b()) //6
} // 匿名返回值
func a() int {
x := 5
defer func() {
x++
}()
return x
} // 有名返回值
func b() (x int) {
x = 5
defer func() {
x++
}()
return x
}

使用匿名返回函数,控制台打印的是5,这是执行return x时,首先定义 返回值=x(非同一个变量),然后执行defer x++,最后return返回值,而此时返回值已经=x,x++不会再影响返回值了,所以返回的是5。

使用有名返回时,就指定了返回值=x(同一个变量,内存地址相同),所以x++后,返回的值也++了。

3. defer注册要延迟执行的函数时该函数所有的参数都需要确定其值

func calc(index string, a, b int) int {
ret := a + b
fmt.Println(index, a, b, ret)
return ret
} func main() {
x := 1
y := 2
defer calc("AA", x, calc("A", x, y))
x = 10
defer calc("BB", x, calc("B", x, y))
y = 20
}

第一次注册defer calc("AA", x, calc("A", x, y))时,会执行里面的calc("A", x, y),此时x=1,y=2,所以先打印,

A 1 2 3

于是defer calc("AA", x, calc("A", x, y))中的参数被确定,是defer calc("AA", 1, 3)

接下来x=10,y没变,仍等于2,执行defer calc("BB", x, calc("B", x, y)),执行calc("B", x, y),打印

B 10 2 12

于是defer calc("BB", x, calc("B", x, y))中的参数被确定,是defer calc("BB", 10, 12)

然后按照defer顺序执行,先执行defer calc("BB", 10, 12),再执行defer calc("AA", 1, 3),所以打印

BB 10 12 22
AA 1 3 4

Golang defer使用的更多相关文章

  1. golang defer 延后执行什么

    对于golang的defer,我们已经知道,defer定义的语句可以延后到函数返回时执行. 经常用在文件的关闭,锁的释放等场景中.而且defer定义的语句即使遇到panic也会执行.这样,可以执行必要 ...

  2. golang defer的使用

    defer一般用于在函数结束时执行必要的处理工作.例如,关闭文件描述符,关闭网络连接等等. 函数中可以定义多个defer,执行的时候按照先进后出的顺序. defer定义的语句,即使遇到panic,也会 ...

  3. 拒绝滥用golang defer机制

    原文链接 : http://www.bugclosed.com/post/17 defer机制 go语言中的defer提供了在函数返回前执行操作的机制,在需要资源回收的场景非常方便易用(比如文件关闭, ...

  4. golang defer使用——资源关闭时候多用

    defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...

  5. golang defer那些坑

    defer以下几个特性,使用时需要关注下. 即时的参数传递 调用os.Exit()时defer不会被执行 defer与return的先后顺序 1.即时的参数传递 定义defer时传入的参数,是作为拷贝 ...

  6. golang defer 以及 函数栈和return

    defer 作为延迟函数存在,在函数执行结束时才会正式执行,一般用于资源释放等操作 参考一段代码https://mp.weixin.qq.com/s/yfH0CBnUBmH0oxfC2evKBA来分析 ...

  7. Golang入门教程(十三)延迟函数defer详解

    前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在 ...

  8. 探究 Go 语言 defer 语句的三种机制

    Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...

  9. 【GoLang】panic defer recover 深入理解

    唉,只能说C程序员可以接受go的错误设计,相比java来说这个设计真的很差劲! 我认为知乎上说的比较中肯的: 1. The key lesson, however, is that errors ar ...

  10. golang中defer的使用规则

    转自个人博客chinazt.cc 在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用. ...

随机推荐

  1. (二).JavaScript的运算符和表达式,数据类型转化

    4. 运算符和表达式 4.3 赋值运算符和表达式 1.赋值运算符 = 作用:赋值运算符就是将右边的内容赋值给左边的变量或属性. var result = 1 + 2; 2.复合赋值运算符 +=,-=, ...

  2. Java压缩音频视频工具类

    /** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public class vedio { ...

  3. linux/windows常见文件系统最大支持单个文件大小

    windows常见文件系统:FAT12/FAT16/FAT32/NTFS/NTFS5.0 对应支持大小:      8M/2G/4G/64G/2TB linux常见文件系统:ext2/ext3/ext ...

  4. 2021SWPUCTF-WEB(二)

    ez_unserialize ​ 不知道在哪,御剑扫叭 ​ 有一个robots.txt ​ ​ 一道反序列化好像是 分析代码应该是admin=admin.passwd=ctf即可输出flag < ...

  5. 11. ASCII, unicode, utf-8, gbk的区别

    这是几种编码方式 ASCII是包含英文字母数字特殊字符等, 长度是1字节, 前128个是基础ASCII码, 128个以后是扩展ASCII码 GBK是国标扩展码, 长度2字节, 表示汉字以及各少数民族语 ...

  6. Spring全家桶

    常用框架的知识点汇总,如图: 一.5个常用的spring框架 ▌1.spring framework 也就是我们经常说的spring框架,包括了ioc依赖注入,Context上下文.bean管理.sp ...

  7. pyecharts 学习使用网址

    pyecharts新版官方手册地址:https://pyecharts.org/#/zh-cn/intro 或http://pyecharts.org/#/?id=pyecharts或http://p ...

  8. mybaits-plus 部分注解说明

    参考: https://blog.csdn.net/qq_45684867/article/details/123951309

  9. 从操作实例“UI界面实现SSH登录服务器并执行命令监控”中学习到的线程与线程间参数传递方法记录

    从操作实例"UI界面实现SSH登录服务器并执行命令监控"中学习到的线程与线程间参数传递方法记录: https://www.cnblogs.com/babashi9527/p/165 ...

  10. 浅谈云原生基础入坑与docker 搭建redis-cluster集群

    浅谈云原生基础入坑与docker 搭建redis-cluster集群 开篇来点自己的小感触:自从走上后端开发这条无法回头的互卷道路以后,在视野内可见新的技术在迭代,更新的技术在不断发行.就拿最近的Op ...