前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang学习之defer

golang学习之defer

作者头像
用户1141560
发布2017-12-26 11:14:04
4970
发布2017-12-26 11:14:04
举报
文章被收录于专栏:西安-晁州

golang中的defer通常用于执行一些资源释放性操作,比如open/close、connect/disconnect、lock/unlock等,对defer理解主要记住以下三点:

1、defer 调用的函数参数的值 defer 被定义时就确定

举个例子,看如下代码:

代码语言:javascript
复制
i := 1
defer fmt.Println("Deferred print:", i)
i++
fmt.Println("Normal print:", i)

正确输出如下:

代码语言:javascript
复制
Normal print: 2
Deferred print: 1

这里的defer调用时,i的值是作为fmt.Println()函数的参数的,defer调用时,函数参数的值已经被上条赋值语句确定了为1,所以这里输出如此。

2、defer 函数内部所使用的变量的值需要在这个函数运行时才确定

这个其实也好理解,就是说如果变量i的值是作为defer函数体内的,那么该i值在return结束之前,才会被确定,举个例子:

代码语言:javascript
复制
func f1() (r int) {
    r = 1
    defer func() {
        r++
    }()
    return 2
}

执行测试:

代码语言:javascript
复制
fmt.Println(f1())

正确输出:3

这里解释下:

首先return并非原子操作,return 2可以拆分为如下两句代码:

代码语言:javascript
复制
r = 2
return

在r=2操作之后,defer中的r++便会执行,这时返回值r被修改为r++,所以实际返回值:3

3、defer 执行顺序为先进先出形式,类似于栈操作

这个如果理解了前两点的话,综合第三点便会知道多个defer共存时具体执行顺序。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档