golang学习之defer
2017-02-06 11:03
232 查看
golang中的defer通常用于执行一些资源释放性操作,比如open/close、connect/disconnect、lock/unlock等,对defer理解主要记住以下三点:
1、defer 调用的函数参数的值 defer 被定义时就确定
举个例子,看如下代码:
正确输出如下:
这里的defer调用时,i的值是作为fmt.Println()函数的参数的,defer调用时,函数参数的值已经被上条赋值语句确定了为1,所以这里输出如此。
2、defer 函数内部所使用的变量的值需要在这个函数运行时才确定
这个其实也好理解,就是说如果变量i的值是作为defer函数体内的,那么该i值在return结束之前,才会被确定,举个例子:
执行测试:
正确输出:3
这里解释下:
首先return并非原子操作,return 2可以拆分为如下两句代码:
在r=2操作之后,defer中的r++便会执行,这时返回值r被修改为r++,所以实际返回值:3
3、defer 执行顺序为先进先出形式,类似于栈操作
这个如果理解了前两点的话,综合第三点便会知道多个defer共存时具体执行顺序。
1、defer 调用的函数参数的值 defer 被定义时就确定
举个例子,看如下代码:
i := 1 defer fmt.Println("Deferred print:", i) i++ fmt.Println("Normal print:", i)
正确输出如下:
Normal print: 2 Deferred print: 1
这里的defer调用时,i的值是作为fmt.Println()函数的参数的,defer调用时,函数参数的值已经被上条赋值语句确定了为1,所以这里输出如此。
2、defer 函数内部所使用的变量的值需要在这个函数运行时才确定
这个其实也好理解,就是说如果变量i的值是作为defer函数体内的,那么该i值在return结束之前,才会被确定,举个例子:
func f1() (r int) { r = 1 defer func() { r++ }() return 2 }
执行测试:
fmt.Println(f1())
正确输出:3
这里解释下:
首先return并非原子操作,return 2可以拆分为如下两句代码:
r = 2 return
在r=2操作之后,defer中的r++便会执行,这时返回值r被修改为r++,所以实际返回值:3
3、defer 执行顺序为先进先出形式,类似于栈操作
这个如果理解了前两点的话,综合第三点便会知道多个defer共存时具体执行顺序。
相关文章推荐
- golang学习的点点滴滴:异常处理 defer, panic, recover
- golang学习
- go语言学习-在ubuntu上安装golang
- Golang开发学习笔记
- Golang学习 - io/ioutil 包
- PostgreSQL参数学习:vacuum_defer_clean_age
- Golang学习 - bufio 包
- Golang学习 - strconv 包
- Golang学习 - unicode 包
- Golang学习 - io 包
- go语言学习-golang的基本数据类型
- 老虞要学GoLang-为什么会学习GoLang
- Golang学习[基础]
- Golang学习 - strings 包
- Golang 学习及使用
- go语言学习-golang保留字
- go语言学习:web服务器 golang版
- 学习一下golang 练习70 web crawler (网络爬虫)
- Golang学习 - regexp 包
- Golang学习 - bytes 包