微信号:Golangweb

介绍:欢迎来到 Go语言社区 社区网址:www.golangweb.com APP网址:app.golangweb.com 社区非公司性质,完全个人爱好建立;做的不好的地方大家见谅.

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

2017-12-04 22:16 厚土火焰山

菅俊菠,70后IT人,程序员到产品经理/项目经理,先后涉猎教育、企管、煤矿、电商等多个领域的系统开发和团队管理工作。擅长业务分析、团队管理,关注前沿技术,目前注意力在golang、kotlin。微信号:hotu2010

共 1149 字,阅读需 3 分钟

当函数中有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语言社区 更多文章 Golang使用redis protocol实现pubsub通信 Golang泛型编程初体验 Golang Cookie 简介 Golang处理JSON(二)--- 解码 Golang处理JSON(一)--- 编码
猜您喜欢 开年福利:1000元又拍云代金券限额放送! 告别外卖“黑作坊”,零成本打造千万并发后厨直播 微博如何做到1小时增加一千台服务器应对鹿晗恋情带来的流量暴增 火爆的Docker不是“上帝” 两个性格迥异CEO的不同结局