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 开始打印的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • [TOC] golang语言defer特性详解 defer语句是go语言提供的一种用于注册延迟调用的机制,它可以让...
    木鸟飞鱼阅读 4,223评论 3 4
  • 本文将会讲解defer, recover,panic相关的知识。主要内容包括: defer的原理panic与rec...
    链人成长chainerup阅读 1,103评论 0 0
  • 定义 defer语句被用于预定对一个函数的调用。我们把这类被defer语句调用的函数称为延迟函数。 注意,defe...
    ycyoes阅读 2,132评论 0 2
  • 我们之所以活得有滋有味、多姿多彩,是身份赋予的结果,每一种身份都代表着一个角色,虽然不同角色同时作用在我们身上,总...
    宋阿娜阅读 412评论 0 7
  • 每接手一个班级,不讲年级高低,我都得给孩子补课——补朗读!不仅因为朗读是学生语文学习最基本的一面,还因为可以通过朗...
    yhj灵阅读 309评论 0 1