Go语言之defer
defer fmt.Println("The finishing touches.")
这里的表达式语句必须代表一个函数或方法的调用。注意,既然是表达式语句,那么一些调用表达式就是不被允许出现在这里的。比如,针对各种内建函数的那些调用表达式。因为它们不能被称为表达式语句。另外,在这个位置上出现的表达式语句是不能被圆括号括起来的。
defer func() {
       fmt.Println("The finishing touches.")
}()
注意,一个针对匿名函数的调用表达式是由一个函数字面量和一个代表了调用操作的一对圆括号组成的。
func begin(funcName string) string {
    fmt.Printf("Enter function %s.\n", funcName)
    return funcName
}
func end(funcName string) string {
    fmt.Printf("Exit function %s.\n", funcName)
    return funcName
}
func record() {
    defer end(begin("record"))
    fmt.Println("In function record.")
}
outputs:
func printNumbers() {
    for i := 0; i < 5; i++ {
      defer fmt.Printf("%d ", i)
    }
 }
outputs:
fmt.Printf("%d ", 1)
fmt.Printf("%d ", 2)
fmt.Printf("%d ", 3)
fmt.Printf("%d ", 4)
对延迟函数调用表达式的求值顺序是与它们所在的defer语句被执行的顺序完全相反的。每当Go语言把已代入参数值的延迟函数调用表达式另行存储后,还会把它追加到一个专门为当前外围函数存储延迟函数调用表达式的列表中。而这个列表总是LIFO(Last In First Out,即后进先出)的。因此,这些延迟函数调用表达式的求值顺序会是:
fmt.Printf("%d ", 4)
fmt.Printf("%d ", 3)
fmt.Printf("%d ", 2)
fmt.Printf("%d ", 1)
fmt.Printf("%d ", 0)
例:
func appendNumbers(ints []int) (result []int) {
    result = append(ints, 1)
    fmt.Println(result)
    defer func() {
          result = append(result, 2)
    }()
    result = append(result, 3)
    fmt.Println(result)    defer func() {
           result = append(result, 4)
    }()
    result = append(result, 5)
    fmt.Println(result)    defer func() {
            result = append(result, 6)
    }()
    return result
 }
outputs:
func printNumbers() {
    for i := 0; i < 5; i++ {
       defer func() {
             fmt.Printf("%d ", i)
       }()
    }
}
outputs:
fmt.Printf("%d ", i)
defer func() {
            fmt.Printf("%d ", i)
}()
defer func() {
            fmt.Printf("%d ", i)
}()
defer func(i int) {
            fmt.Printf("%d ", i)
}(i)
defer func(i int) {
            fmt.Printf("%d ", i)
}(0)
func modify(n int) (number int) {
    fmt.Println(number)
    defer func() {
           number += n
    }()
    number++
    return
}
func modify(n int) (number int) {
    fmt.Println(number)
     defer func(plus int) (result int) {
             result = n + plus
             number += result
             return
    }(3)
    number++
    return
}
modify(2),结果为:6
Go语言之defer的更多相关文章
- Go语言异常处理defer\panic\recover
		Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ... 
- go语言的defer语句
		转: https://www.jianshu.com/p/5b0b36f398a2 ---------------------------------------------------------- ... 
- Go语言之defer关键字
		类似于java中的finally, 在函数返回来执行, 它用来保证函数一定会作一些事情. package main import "fmt" func main() { defer ... 
- go语言笔记——defer作用DB资源等free或实现调试
		defer 和追踪 关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为 return 语句同样可以 ... 
- go语言 defer 你不知道的秘密!
		go 语言的defer功能强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.我们先来看几个例子. 例一: defer 是先进后出 这个很自然,后面的语句会依赖前面的资源,因此如果先前面的资源先 ... 
- 【GoLang】转载:我为什么放弃Go语言,哈哈
		我为什么放弃Go语言 作者:庄晓立(Liigo) 日期:2014年3月 原创链接:http://blog.csdn.NET/liigo/article/details/23699459 转载请注明出处 ... 
- 我为什么放弃Go语言
		有好几次,当我想起来的时候,总是会问自己:我为什么要放弃Go语言?这个决定是正确的吗?是明智和理性的吗?事实上我一直在认真思考这个问题. 开门见山地说,我当初放弃Go语言(golang),就是由于两个 ... 
- go defer (go延迟函数)
		go defer (go延迟函数) Go语言的defer算是一个语言的新特性,至少对比当今主流编程语言如此.根据GO LANGUAGE SPEC的说法: A "defer" sta ... 
- Golang入门教程(十三)延迟函数defer详解
		前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在 ... 
随机推荐
- python 装饰器简介
			24.装饰器 1.@ + 函数名:#1自动执行outer函数并且将下面的函数名f1当做参数传递 #2将outer函数的返回值,重新赋值给f1. def ou ... 
- 自己封装的HttpRequest,个人觉的比较HttpHelper好用
			新年开篇,忙归忙,还是要写点什么,不然越来越懒,分享我写的HttpTooler public delegate void RequestCompleted(object sender, string ... 
- sqoop组件运行出错问题解决--com.mysql.jdbc.Driver
			sqoop list-tables --connect jdbc:mysql://192.168.11.94:3306/huochetoudalian --username xxx -password ... 
- RAILS ON
			我是按照下面这个URL来轻快安装的. http://lxiaodao.iteye.com/blog/1579992 (1)RVM官方网站应该是改版过一次, 使用 curl -L https://get ... 
- Activity大致会经过如下四个状态
			1.活动主题:当前Activity位于前台,用户可见,可以获得焦点.2.暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点.3.停止状态:该Activity不可见,失 ... 
- VCC、VDD、VEE、VSS
			转载自:http://www.cnblogs.com/asus119/archive/2011/10/11/2206841.html 版本一: 简单说来,可以这样理解: 一.解释 VCC:C=circ ... 
- hibernate 映射<三>一对一外键键关联
			bean 关系: 正向工程: 反向工程: 逆向生成步骤: 生成的xml: ... from hbm_one2one_pk.person person0_ left outer join hbm_one ... 
- FILTER的执行次数和驱动表问题
			drop table test1; create table test1 as select * from dba_objects where rownum<1000; drop table t ... 
- 好吧,使用sql实现Dijkstra算法
			我本来不想做这么蛋疼的事情的,可是更蛋疼的是我看了王大神的博客然后中毒了!我发誓再!不!看!了!不过问题本身还是有一点意思的,正好学过图论没有实现过dijkstra,刚好在慕课上又学了一点pl/sql ... 
- Zabbix中文使用手册
			一.Zabbix简介 详情参考“企业监控利器-zabbix”http://waringid.blog.51cto.com/65148/904201. 二.Zabbix使用 2.1 Zabbix框架介绍 ... 
