defer和return的执行时机

zero

在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
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
阅读 568
6 声望
0 粉丝
0 条评论
6 声望
0 粉丝
文章目录
宣传栏