跳至主要內容

Golang defer 函数和 return

安格原创golanggolang大约 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
}


参考资料:
https://www.topgoer.com/函数/延迟调用 defer.htmlopen in new window

上次编辑于:
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3