在Go语言return不是原子操作,分为返回值赋值
和RET指令
两步。
例如:return x实现步骤
- 返回值 = x
- 执行defer
- 执行SET指令
后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