乐趣区

关于golang:defer和return的执行时机

在 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
退出移动版