defer用于延迟执行,可以类比于java或c++中的析构函数。

查看一段示例代码:

func Contents(filename string) (string, error) {

//打开文件

f, err := os.Open(filename)

if err != nil {

return "", err

}

//使用延期调用,由于defer的作用,在Contents函数执行结束完成后才会关闭文件,紧跟着open,可以防止忘掉关闭,且代码结构更清晰

defer f.Close() //f.Closewillrunwhenwe'refinished.

var result []byte

buf := make([]byte, )

for {

n, err := f.Read(buf[:])

result = append(result, buf[:n]...) // append is discussed later. if err != nil {

if err == io.EOF {

break

}

return "", err //如果这时候返回,f.Close()随后会被掉用

}

return string(result), nil // //如果这时候返回,f.Close()随后会被掉用

}

使用defer需要记住两点

1、先进后出的顺序

2、函数参数会在使用defer调用时就被求值。

例2:

defer fmt.Print("a ")

defer fmt.Print("b ")

输出结果为:b a

因为后进先出,就像用砖砌墙一样,后来者居上。

例3:

i := 

defer fmt.Printf("%d ", i)

i = 

defer fmt.Printf("%d ", i)

输出结果:

10 0

执行第一个defer时,使用的值是0,而不是函数最后执行结束时变成的10。

Go defer延迟执行的更多相关文章

  1. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...

  2. go 学习笔记之解读什么是defer延迟函数

    Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只 ...

  3. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数

    温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...

  4. defer 延迟调用

    1. 延迟调用 defer 的用法很简单,只要在后面跟一个函数的调用,就能实现将这个  xxx 函数的调用延迟到当前函数执行完后再执行. defer xxx()   这是一个很简单的例子,可以很快帮助 ...

  5. ThreadPoolTimer -延迟执行, 周期执行

    介绍重新想象 Windows 8 Store Apps 之 线程池 通过 ThreadPoolTimer 实现延迟执行 通过 ThreadPoolTimer 实现周期执行 通过 ThreadPool ...

  6. 浅谈iOS开发中方法延迟执行的几种方式

    Method1. performSelector方法 Method2. NSTimer定时器 Method3. NSThread线程的sleep Method4. GCD 公用延迟执行方法 - (vo ...

  7. LINQ之路 6:延迟执行(Deferred Execution)

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  8. IOS中延迟执行的几种方法

    前几天去国美在线面试,就遇到了上面的问题,当时是笔试,只写出来了第一种方法,现在整理了一下. //1.performSelector方法:在当前线程中执行的方法,使用默认模式,并延迟执行@select ...

  9. js中的延迟执行和定时执行

    在js中,延迟执行函数有两种,setTimeout和setInterval,用法如下: function testFunction(){Console.log('hovertree.com');} s ...

随机推荐

  1. jQuery右键菜单ContextMenu使用笔记

    插件下载地址:http://www.trendskitchens.co.nz/jquery/contextmenu/jquery.contextmenu.r2.packed.js 和http://ww ...

  2. 金额input框控制只能小数点后有两位的有效数字

    <%@include file="/WEB-INF/jsp/common/common.jsp" %> <title>价格录入限定</title> ...

  3. 怎么用一行代码解决CSS各种IE各种兼容问题

    用一行代码来解决CSS在,IE6,IE7,IE8,IE9,IE10 中的各种兼容性问题. 在网站前端写代码的过程中,很多时间IE各个版本的兼容问题很难整.现在百度与谷歌都有了一行解决这种兼容性的代码了 ...

  4. dedecms后台登录如何去除验证码设置

    dedecms后台验证有时间输入总是不对,有时候却不显示,而输入验证码无疑是一个麻烦的过程,那么我们怎么样来去除后台验证码,实现输入帐号密码直接登录呢?我来为大家介绍一下: 让人感到烦恼的情况出现了! ...

  5. 学习java 第1天

    自己是刚刚开始自学java看了视频和书 =-=,刚开始我先对命令窗口进行了一个大体上的了解 ,首先是打开,可以右键开始键,然后选择命令提示符,我更喜欢第二种,就是使用Win+R,然后输入cmd进入,我 ...

  6. JS日期(Date)处理函数总结

    获取日期 1.Date() ——返回当日的日期和时间. 2.getDate() ——从 Date 对象返回一个月中的某一天 (1 ~ 31). 3.getDay() ——从 Date 对象返回一周中的 ...

  7. jQuery插件Skippr实现焦点图

    史上效果最好的焦点图幻灯片jQuery插件Skippr,轻量级插件.响应式布局插件,强大的参数自定义 配置,可自定义切换速度.切换方式.是否显示左右箭头.是否自动播放.自动播放间隔时间等配置 参数,调 ...

  8. yii2.0 DetailView 自定义样式

    GII 生成如下: <?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', ['label'=> ...

  9. (五)、nodejs使用bootstrap的样式进行分页

    一.page方法 /****************************************************** * Created User: * Created Time: 201 ...

  10. LevelDB源码剖析

    LevelDB的公共部件并不复杂,但为了更好的理解其各个核心模块的实现,此处挑几个关键的部件先行备忘. Arena(内存领地) Arena类用于内存管理,其存在的价值在于: 提高程序性能,减少Heap ...