在Go语言return不是原子操作,分为返回值赋值
和RET指令
两步。
例如:return x实现步骤
- 返回值 = x
- 执行defer
- 执行SET指令
多个defer
相似栈,后defer先执行
func main() { out()}func out() () { defer func() {fmt.Println("world")}() defer func() {fmt.Println("hello")}()}
输入
helloworldProcess 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 put 1return 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 out put 2return out put 2