defer和return的执行时机

在Go语言return不是原子操作,分为返回值赋值RET指令两步。
例如:return x实现步骤

  1. 返回值 = x
  2. 执行defer
  3. 执行SET指令
多个defer 类似栈,后defer先执行
func main(){ out() }func out() () { defer func() {fmt.Println("world")}() defer func() {fmt.Println("hello")}() }

输出
hello worldProcess finished with the exit code 0

带返回值 defer不影响return返回值
func main(){ fmt.Println("return out put", out()) }func out() int { i := 0 defer func() { i++// 不影响return返回值 fmt.Println("defer out put ", i) }() return i// 返回值=i=0; i++ }

输出
defer out put1 return out put 0

带命名返回值 defer影响return返回值
func main(){ fmt.Println("return out put", out()) }func out() (i int) { defer func() { i++// 影响return返回值 fmt.Println("defer out put ", i) }() return 1// i=1; i++ }

【defer和return的执行时机】输出
defer out put2 return out put 2

    推荐阅读