内容简介:见如下例子:输出结果:
defer
关键字在 go 中用于 return
之前执行,在 golang官方文档
中有说明。 defer
的用法类似 java 中的 finally
语句块,一般用于释放已分配的资源。
见如下例子:
package main
import (
"io"
"log"
)
func run(s string) (n int, err error) {
defer func() {
log.Printf("run(%q) = %d, %v", s, n, err)
}()
return 7, io.EOF
}
func main() {
run("Go")
}
输出结果:
2019/01/31 15:13:21 run("Go") = 7, EOF
那么这个结果该如何理解呢?要使用 defer
时不踩坑,最重要的一点就是要明白, return xxx
这一条语句并不是一条原子指令!所以总结出返回过程如下:
-
首先执行
defer之前对返回值赋值 -
然后调用
defer表达式 -
调用
return
将上述规则改写成程序形式:
返回值 = xxx 执行 defer 直接return
按照这个方法改写上述程序:
func run(s string) (n int, err error) {
n = 7
err = EOF
defer func() {
log.Printf("run(%q) = %d, %v", s, n, err)
}()
return
}
run("Go") = 7, EOF
goroutine的控制结构中,有一张表记录 defer
,调用 runtime.deferproc
时会将需要 defer
的表达式记录在表中,而在调用 runtime.deferreturn
的时候,则会依次从defer表中出栈并执行。
即多个 defer
调用的时候遵循后入先出原则。
以上所述就是小编给大家介绍的《GO中defer关键字》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Clean Architecture
Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99
Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!
随机密码生成器
多种字符组合密码
Markdown 在线编辑器
Markdown 在线编辑器