`
stephen830
  • 浏览: 2964756 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

defer 延迟函数

 
阅读更多

defer 延迟函数

defer 又是一个创新,它的作用是:延迟执行,在声明时不会立即执行,而是在函数return后时按照后进先出的原则依次执行每一个defer。这样带来的好处 是,能确保我们定义的函数能百分之百能够被执行到,这样就能做很多我们想做的事,如释放资源,清理数据,记录日志等

这里我们重点来说明下defer的执行顺序.

 

func deferFunc() int {
    index := 0

    fc := func() {

        fmt.Println(index, "匿名函数1")
        index++

        defer func() {
            fmt.Println(index, "匿名函数1-1")
            index++
        }()
    }

    defer func() {
        fmt.Println(index, "匿名函数2")
        index++
    }()

    defer fc()

    return func() int {
        fmt.Println(index, "匿名函数3")
        index++
        return index
    }()
}

func main() {
    deferFunc()
}

 

这里输出结果如下,

0 匿名函数3
1 匿名函数1
2 匿名函数1-1
3 匿名函数2

有如下结论:

  • defer 是在执行完return 后执行
  • defer 后进先执行

另外,我们常使用defer去关闭IO,在正常打开文件后,就立刻声明一个defer,这样就不会忘记关闭文件,也能保证在出现异常等不可预料的情况下也能关闭文件。而不像其他语言:try-catch 或者 using() 方式进行处理。

file , err :=os.Open(file)
if err != nil {
    return err
}
defer file.Close() 
//dosomething with file

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    GO语言延迟函数defer用法分析

    本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下: defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放...

    Go语言中的延迟函数defer示例详解

    Go 语言中延迟函数 defer 充当着 try…catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer、return、返回值、panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘...

    前端开源库-defer-promise

    前端开源库-defer-promise延迟承诺,返回延迟承诺的同构函数。使用本机

    Golang学习笔记之延迟函数(defer)的使用小结

    主要介绍了Golang学习笔记之延迟函数(defer),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    golang中defer的关键特性示例详解

    大家都知道golang的defer关键字,它可以在函数返回前执行一些操作,最常用的就是打开一个资源(例如一个文件、数据库连接等)时就用defer延迟关闭改资源,以免引起内存泄漏。本文主要给大家介绍了关于golang中defer...

    GO语言Defer用法实例分析

    defer:调用一个被 defer 的函数时在函数刚要返回之前延迟执行,当函数无论怎样返回,某资源必须释放时,可用这种与众不同、但有效的处理方式。传统的例子包括解锁互斥或关闭文件。 这样延迟一个函数有双重优势:一是...

    浅谈Angular的$q, defer, promise

    defer的字面意思是延迟,$q.defer() 可以创建一个deferred实例(延迟对象实例)。 deferred 实例旨在暴露派生的Promise 实例,以及被用来作为成功完成或未成功完成的信号API,以及当前任务的状态。这听起来好复杂的...

    p-defer:建立延期承诺

    延迟建立延期承诺 更喜欢Promise构造函数。安装$ npm install p-defer用法import pDefer from 'p-defer' ;function delay ( milliseconds ) {const deferred = pDefer ( ) ;setTimeout ( deferred . resolve , ...

    cdefer:在 C 中延迟函数调用的类似 Golang 的功能

    延迟C 语言的 Golang 风格 defer 语句。例子# include < cdefer># include < pthread>pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;int main ( void ) { pthread_mutex_lock (&m); defer ( pthread_mutex_unlock ...

    backburner.js:将Ember.js运行循环重写为通用微库

    资料下载大师: , 原料药建设者建设者描述new Backburner() 使用队列名称数组实例化Backburner实例实例方法方法描述Backburner#run 执行传递的函数并刷新所有延迟的操作Backburner#defer 延迟传递的函数以在指定...

    go开发实战.doc

    5.6 延迟调用defer 30 5.6.1 defer作用 30 5.6.2 多个defer执行顺序 30 5.6.3 defer和匿名函数结合使用 31 5.7 获取命令行参数 31 5.8 作用域 32 5.8.1 局部变量 32 5.8.2 全局变量 33 5.8.3 不同作用域同名...

    xdefer:用于 golang 实用程序的 RAII

    使用关键字 defer 进行清理时,保存的语句总是在周围函数返回后执行。 有时我们需要更精确地控制动作的执行时间。 1.函数返回后执行动作,和原来的defer一样。 func DoSomething () { var xd xdefer. Defer //...

    jQuery的deferred对象详解

    一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取...在英语中,defer的意思是”延迟”,所以deferred对象的含义就是”延迟”到未来某个

    jquery基础教程之deferred对象使用方法

    一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取...在英语中,defer的意思是”延迟”,所以deferred对象的含义就是”延迟”到未来某个

    Go 语言编程 + Go 学习笔记

    3.1 函数定义 3.2 变参 3.3 返回值 3.4 匿名函数 3.5 延迟调 3.6 错误处理 第 4 章 数据 4.1 Array 4.2 Slice 4.3 Map 4.4 Struct 第 5 章 法 5.1 法定义 5.2 匿名字段 5.3 法集 5.4 表达式 第 6 章 接 6.1 接 定义...

    go-lazy:用于同步延迟评估数据的延迟类型

    懒惰的 用于同步延迟评估数据的延迟类型。 Lazy 控制一个 0 参数函数,可用于初始化捕获的指针。 为了解决缺乏泛型的问题,Lazy 可以“控制”这个伴随的指针,比如 Mutex。例子 package mainimport lazy "github....

    javascript学习笔记(一)基础知识

    因此,在[removed]元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。在XHTML文档中,要把defer属性设置为defer=“defer 异步脚本 html5为[removed]定义了async属性。整个属性与defer属性类似,都用于...

    Go学习笔记(第四版).zip

    3.5 延迟调⽤ 34 3.6 错误处理 35 第 4 章 数据 39 4.1 Array 39 4.2 Slice 40 4.3 Map 45 4 Go 学习笔记, 第 4 版 4.4 Struct 47 第 5 章 ⽅法 53 5.1 ⽅法定义 53 5.2 匿名字段 54 5.3 ⽅法集 56 5.4 表达式 56 第...

    go学习笔记

    3.5 延迟调⽤用 34 3.6 错误处理 35 第 4 章 数据 39 4.1 Array 39 4.2 Slice 40 4.3 Map 45 Go 学习笔记, 第 4 版 4 4.4 Struct 47 第 5 章 ⽅方法 53 5.1 ⽅方法定义 53 5.2 匿名字段 54 5.3 ⽅方法集 56 5.4 ...

Global site tag (gtag.js) - Google Analytics