Golang defer 函数和 return
原创大约 3 分钟...
return 语句的执行步骤
return 语句执行步骤:
1、返回值赋值
2、defer 语句
3、真正 RET 返回
return 是非原子性的,需要两步,首先要将返回值放到一个临时变量中(为返回值赋值),然后将返回值返回到被调用处。而 defer 函数在 return 的两个操作之间执行
真正的执行顺序是:
先为返回值赋值,即将返回值放到一个临时变量中,然后执行 defer,然后 return 到函数被调用处
如果所在函数为有名返回值函数,return 第一步先把返回值放到有名返回值变量中,如果恰好 defer 函数中修改了该返回值,那么最终返回更新后的值
如果所在函数为无名返回值函数,那么 return 第一步先把返回值放到一个临时变量中,defer 函数无法获取到这个临时变量地址,所以无论 defer 函数做任何操作,都不会对最终返回值造成任何变动
func main() {
s1 := defer1()
s2 := defer2()
s3 := defer3()
s4 := defer4()
s5 := defer5()
s6 := defer6()
fmt.Println("s1的值=>", s1) // 10
fmt.Println("s2的值=>", s2) // 5
fmt.Println("s3的值=>", s3) // 1
fmt.Println("s4的值=>", s4) // 0
fmt.Println("s5的值=>", s5) // 0
fmt.Println("s6的值=>", s6) // 10
}
func defer1() (r int) {
r = 5
defer func() {
r = r + 1
}()
return 9 // 这一步r已经变成9
}
func defer2() (r int) {
t := 5
defer func() {
t = t + 5
}()
return t // 这一步r已经变成5
}
func defer3() (r int) {
defer func(r int) {
r = r + 5
}(r)
return 1 // 这一步r已经变成1
}
func defer4() (r int) {
defer func(r int) {
r = r + 5
}(r)
return
}
func defer5() (r int) {
t := 5
defer func() {
t = t + 5
}()
return
}
func defer6() (r int) {
r = 5
defer func() {
r = r + 5
}()
return
}