defer

被defer关键字修饰的函数会在**defer所在的函数 return之前 再执行。
例如:

func int() int {
  defer release()
  ****
  ****
  return 0;
}
// release方法会在return 0之后执行(xxx)

return并非一条原子性语句
在return时会调用 defer函数

例如;

func f() (r int){
  t := 5
  defer func() {
    t = t + 5
    }()
  return t

遵守以下规则进行return:

  1. 返回值 = xxx (定义的返回什么就是什么)
  2. 调用 defer 函数
  3. return

那么,return t应该改写为:

r := t //r = 5
// 调用defer函数:
func() {
  t = t + 5
  }()
return

可以看到,defer函数并没有改变r的值,所以返回值应该是5

再例如:

package main

import "fmt"

var g = 100

func f() (r int) {
    r = g
    defer func() {
        r = 200
    }()

    fmt.Printf("f: r = %d\n", r)

    r = 0
    return r
}

func main() {
    i := f()
    fmt.Printf("main: i = %d, g = %d\n", i, g)
}

return r应该改写为:

r = 0
defer func() {
    r =200
  }()
return

此处的defer函数改写了r的值,所以返回值是200

注意:

  1. defer 在 Panic之后任然可以执行
  2. defer遵守栈规则,即多个defer 后面的先执行
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容