package main import "fmt" // golang 函数中 return 不是原子操作 底层分为 两步 执行 // 1. 返回值赋值 (如果 没有 指定返回值 变量名 则为内部的一个 匿名变量) // 2. 真正的 return 返回 // defer 执行的 时机是在 这两步之间 func demo() int { x := 5 defer func() { // 此处修改的是 x 不是 真正的 返回值 x++ }() // 此时 x 已经赋值给返回值 return x } func demo2() (x int) { defer func() { // 返回值 x++ = 6 x++ }() // 返回值 x 赋值为 5 return 5 } func main() { res := demo() fmt.Printf("demo => %T %+v\n", res, res) res = demo2() fmt.Printf("demo => %T %+v\n", res, res) }