在 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")}()}
输入
hello
world
Process 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 1
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 out put 2
return out put 2