zoukankan      html  css  js  c++  java
  • golang学习之defer

    golang中的defer通常用于执行一些资源释放性操作,比如open/close、connect/disconnect、lock/unlock等,对defer理解主要记住以下三点:

    1、defer 调用的函数参数的值 defer 被定义时就确定

    举个例子,看如下代码:

    i := 1
    defer fmt.Println("Deferred print:", i)
    i++
    fmt.Println("Normal print:", i)

    正确输出如下:

    Normal print: 2
    Deferred print: 1

    这里的defer调用时,i的值是作为fmt.Println()函数的参数的,defer调用时,函数参数的值已经被上条赋值语句确定了为1,所以这里输出如此。

    2、defer 函数内部所使用的变量的值需要在这个函数运行时才确定

    这个其实也好理解,就是说如果变量i的值是作为defer函数体内的,那么该i值在return结束之前,才会被确定,举个例子:

    func f1() (r int) {
        r = 1
        defer func() {
            r++
        }()
        return 2
    }

    执行测试:

    fmt.Println(f1())

    正确输出:3

    这里解释下:

    首先return并非原子操作,return 2可以拆分为如下两句代码:

    r = 2
    return

    在r=2操作之后,defer中的r++便会执行,这时返回值r被修改为r++,所以实际返回值:3

    3、defer 执行顺序为先进先出形式,类似于栈操作

    这个如果理解了前两点的话,综合第三点便会知道多个defer共存时具体执行顺序。

  • 相关阅读:
    sqlserver 批量删除所有表语句
    C# 中的委托和事件
    Oracle建立用户
    C# Linq获取两个List或数组的差集交集
    Linux下Redis安装与配置操作说明
    word缩印
    centos7上的postgresql10安装和配置
    numpy技巧
    发票二维码扫描增强_06_持续优化
    发票二维码扫描增强_05_构建目标二维码
  • 原文地址:https://www.cnblogs.com/vipzhou/p/6369537.html
Copyright © 2011-2022 走看看