Golang defer 中变量的赋值,return了也给你改了

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在函数执行完毕后执行,及时的释放资源。

希望这个博客能对你有所益处。我是轻王,我为自己代言。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫轻王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值