golang语言中的return语句不是原子操作,分为(1)返回值赋值和(2)RET指令两步。而defer语句执行在赋值之后,RET之前。

可通过以下程序,深入理解:
package main
import "fmt"
// return语句执行步骤
// 1、返回值赋值
// 2、defer语句
// 3、真正RET返回
func f0() (x int) {
x = 5
defer func() {
x++
}()
return x //返回值RET=x, x++, RET=x=6
}
func f1() int {
x := 5
defer func() {
x++ //修改的是x,不是返回值
}()
return x //返回值RET=5, x++, RET=5
}
func f2() (x int) {
defer func() {
x++
}()
return 5 //返回值RET=x=5, x++, RET=6
}
func f3() (y int) {
x := 5
defer func() {
x++
}()
return x //返回值RET=y=x=5, x++, RET=5
}
func f4() (x int) {
defer func(x int) {
x++
}(x)
return 5 //返回值RET=x=5, x`++, RET=5
}
func main() {
fmt.Println(f0()) //6
fmt.Println(f1()) //5
fmt.Println(f2()) //6
fmt.Println(f3()) //5
fmt.Println(f4()) //5
}
1198

被折叠的 条评论
为什么被折叠?



