Go中深刻理解return与defer
作者: 何忠利 • 发表于 2019-03-19
在Go语言中可以定义函数的返回值的类型与返回值的变量名,还有defer注册的代码块,(defer一般都是用来关闭资源句柄或数据库连接等等),为了在以后开发过程中更熟悉return与定义返回值变量名与defer之间的关系,我们必须来深刻理解下!
这边需要你对go语言的基础语法了解即可 。
代码如下:
package main
import "fmt"
// 'return'与'defer'关键字的使用说明
func main() {
fmt.Println(f1()) // 5
fmt.Println(f2()) // 6
fmt.Println(f3()) // 5
fmt.Println(f4()) // 5
fmt.Println(f5()) // 6
}
// 问题解析:
// 1.定义变量x=5
// 2.没有指定返回值变量的名字,以字面`return x`得到(汇编)具体的返回值等于5
// 3.执行defer匿名函数x=6
// 4.RET返回(汇编)获取到返回值也就是5
func f1() int {
x := 5
defer func() {
x++
}()
return x
}
// 问题解析:
// 1.定义int类型返回值并且变量名为x
// 2.根据字面`return 5`得到返回值变量x等于5,此时(汇编)具体的返回值等于x变量
// 3.执行defer匿名函数此时x=6
// 4.RET返回(汇编)指定变量名的x也就是6(最终返回的始终是x变量)
func f2() (x int) {
defer func() {
x++
}()
return 5
}
// 问题解析:
// 1.定义int类型的返回值并且变量名为y
// 2.定义变量x=5
// 3.根据字面的`return x`可以得到(汇编)具体的返回值等于5,但是x不是返回值变量y才是,所以y也赋值等于5,此时(汇编)具体的返回值等于y变量
// 4.执行defer匿名函数此时x等于6
// 5.RET返回(汇编)指定变量名的y也就是5
func f3() (y int) {
x := 5
defer func() {
x++
}()
return x
}
// 问题解析:
// 1.定义int类型的返回值并且变量名为x
// 2.根据字面的`return 5`可以得出返回值变量等于x,此时(汇编)具体的返回值等于x变量
// 3.执行defer匿名函数,有参数传递的话不会去函数体外去寻找,所以x变量还是等于5
// 4.RET返回(汇编)指定变量名的x也就是5
func f4() (x int) {
defer func(x int) {
x++
}(x)
return 5
}
// 问题解析:
// 1.定义int类型的返回值并且变量名为x
// 2.根据字面的`return 5`可以得出返回值变量等于x,此时(汇编)具体的返回值等于x变量
// 3.执行defer匿名函数,通过传递指针的方法去修改x的变量,所以当前x变量等于6了 (这里与f4方法有差异)
// 4.RET返回(汇编)指定变量名的x也就是6
func f5() (x int) {
defer func(x *int) {
(*x)++
}(&x)
return 5
}
查看运行结果
[root@localhost return]# go run main.go
5
6
5
5
6
总结下:
函数中有defer,函数结束步骤为:1.(汇编)具体的返回值 -> 2.执行defer -> 3.(汇编)发送指令RET完成
函数中没defer,函数结束步骤为:1.(汇编)具体的返回值 -> 3.(汇编)发送指令RET完成
作者理解的浅,如有错误欢迎指出。
转发请注明出处!
文章关键词:
# Go
# defer
阅读量:
999
返回主页