Golang defer 中变量的赋值,return了也给你改了
Golang轻松学习文章目录
一、defer 是什么?
在Golang当中,defer代码块会在函数调用链表中增加一个函数调用,会在return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。也可以在代码中优雅的关闭/清理代码中所使用的变量,关闭连接池与错误的捕获。
二、变量的赋值
1.直接声明变量会立刻解析
defer fmt.Println(“fmt a1:”,a)
代码如下(示例):
func main() {
a := 1
defer fmt.Println("fmt a1:",a)
a++
}
结果
2.声明方法,但不影响方法内变量
defer func() {
fmt.Println(“func a2:”,a)
}()
代码如下(示例):
func main() {
a := 1
defer func() {
fmt.Println("func a2:",a)
}()
a++
}
结果
三、变量的赋值顺序
1.后进先出规则
代码如下(示例):
func main() {
a := 1
defer fmt.Println("fmt a1:",a)
defer func() {
fmt.Println("func a2:",a)
a++
}()
defer func() {
fmt.Println("func a3:",a)
a++
}()
a++
}
结果
2.声明方法后,变量可变;直接声明变量不可变
代码如下(示例):
func main() {
a := 1
defer fmt.Println("fmt a1:",a)
defer func() {
fmt.Println("func a2:",a)
a++
}()
defer func() {
fmt.Println("func a3:",a)
a++
}()
a++
}
结果
此时依次声明,
a1 值直接声明变量不可变为1
a2 直接声明方法,a2值随着a值改变
a3 直接声明方法,a3值随着a值改变
方法在 a ++ 后结束,此时a为 2
a3 由于直接声明方法,a3值随着a值改变,此时a值为 2,
再执行a3内 a++,此时a为 3
a2 由于直接声明方法,a2值随着a值改变,此时a值为 3,
再执行a3内 a++,此时a为 4
a1 由于直接声明,a1值不可变,依旧为1
四、return 后 修改返回值
1.原方法
代码如下(示例):
func main() {
a := 1
i := ANum(a)
fmt.Println("i", i)
}
func ANum(a int) (i int) {
fmt.Println("a", a)
return a
}
结果
2.修改返回值
代码如下(示例):
func main() {
a := 1
i := ANum(a)
fmt.Println("i", i)
}
func ANum(a int) (i int) {
defer func() {
i = 100
}()
fmt.Println("a", a)
return a
}
结果
此时返回值已被修改为 100
总结
通过以上来了解Golang中defer 的使用, 在Go语言中,可以使用关键字defer向函数注册退出调用,即主函数退出时,defer后的函数才被调用。defer语句的作用是不管程序是否出现异常,均在函数退出时自动执行相关代码。
在函数中,经常需要创建资源(比如:数据库连接、文件句柄、锁等) ,通过defer在函数执行完毕后执行,及时的释放资源。