defer关键字

defer

在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。
通过defer,我们可以在代码中优雅的关闭/清理代码中所使用的变量。defer作为golang清理变量的特性,有其独有且明确的行为。

defer触发时机

A “defer” statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.

Go官方文档中对defer的执行时机做了阐述,分别是。

  • 包裹defer的函数返回时
  • 包裹defer的函数执行到末尾时
  • 所在的goroutine发生panic时

defer的执行顺序

defer 的本质就是把defer之后的函数压入一个栈(Stack)中延迟执行,所以存在多个 defer 时,其执行顺序是后进先出(LIFO)的。

defer func() { fmt.Println("1") }()
defer func() { fmt.Println("2") }()
defer func() { fmt.Println("3") }()

输出顺序:3,2,1

当defer被声明时,其参数就会被实时解析

一个函数被 defer 时,它的参数就已经确定了,即使 defer 之后参数发生了修改,也不会影响到 defer 时确定的数值。

例如:

func a() {
	i := 0
	defer fmt.Println(i)
	i++
	return
}

上面代码等同于:

func a() {
	i := 0
	defer fmt.Println(0) //此时i=0
	i++
	return
}

defer可以读取有名返回值

被 defer 的函数是在 return 之后执行,可以修改带名称的返回值。

例如代码中的返回值 i,在 defer 的 c() 中被修改了,所以返回的是 2。

func c() (i int) {
	defer func() { i++ }()
	return 1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_李少侠_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值