厚土Go学习笔记 | 15. defer语句延迟函数的执行

当函数中有defer语句,会延迟此语句的执行,直到函数返回后才执行。

defer fmt.Println("")

defer后面的是参数

延迟调用的参数是立刻生成的,但是在上层函数返回前都不会去执行。

看例子,并运行看结果

package main

import "fmt"

func main() {
    defer fmt.Print("Hello")
    fmt.Print("World")
}

你认为执行结果是什么呢?肯定不是HelloWorld,而是

WorldHello

延迟的函数调用是被压入一个栈中。当函数返回时,会按照后进先出的原则,调出被延迟的函数调用。请看下面例子中,i的打印顺序。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Begin...")
    for i := 0; i < 10; i++{
        defer fmt.Println(i)
    }
    fmt.Println("Done")
}

运行结果

Begin...
Done
9
8
7
6
5
4
3
2
1
0

看明白了么?

整个函数的输出已经运行完了,打印了 Done ,然后才开始打印 for 循环的 defer,并且是后进先出的方式,是从 i = 9 开始打印的。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-12-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

深入浅出事件流处理NEsper(二)

NEsper使用的事件类型来描述事件的类型信息。你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型。 EPL中的cr...

202100
来自专栏个人分享

XML编程知识点总结

DOM的全称是Document Object Model,也即文档对象模型。基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合,应用程序挣是通过...

8420
来自专栏阮一峰的网络日志

async 函数的含义和用法

本文是《深入掌握 ECMAScript 6 异步编程》系列文章的最后一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义...

28560
来自专栏Java与Android技术栈

Scala学习笔记(七)

在这里what()方法报错了,主要是因为还缺少了对Cylinder的匹配,只要改成如下的代码就可以正常运行了。

9330
来自专栏李蔚蓬的专栏

JavaScript_note1

4.6.字符串运算符 字符串运算符是用于两个字符型数据之间的运算符,除了比较运算符之外,还可以是+和+=运算符。 Demo:

10920
来自专栏偏前端工程师的驿站

JS魔法堂:那些困扰你的DOM集合类型

一、前言                                     大家先看看下面的js,猜猜结果会怎样吧!   可选答案:   ①. 获取id属...

24590
来自专栏Python爱好者

Python高效编程(一)

23390
来自专栏Golang语言社区

JS基础(下)

事件DOM Event 更多事件请查询h3c htmldom参考手册 event onclick() :当点击时 onfocus() :获得焦点时 ;当...

49570
来自专栏数据之美

Shell 参数扩展及各类括号在 Shell 编程中的应用

今天看有人总结了 shell 下的参数扩展,但不是很全,恰好以前整理过放在百度空间,但百度空间目前半死不活的情况下对 Google 非常不友好,索性一并转过来方...

22570
来自专栏守候书阁

实例感受-es6的常用语法和优越性

前几天,用es6的语法重写了我的一个代码库,说是重写,其实改动的并不多,工作量不大。在重写完了的时候,就个人总结了一下es6常用的一些常用的语法和比es5优越的...

8630

扫码关注云+社区

领取腾讯云代金券