在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")}()}

输入

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