package main

/*
defer 类似其它语言中的析构函数,在函数体执行结束后
按照调用顺序的相反顺序逐个执行,先进后出,
即使函数发生严重错误也会执行,资源清理文件关闭,
支持匿名函数的调用
常用于资源清理、文件关闭、解锁以及记录时间等操作
通过与匿名函数配合可在return之后修改函数计算结果
如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer
时即已经获得了拷贝,如果不是参数则是引用某个变量的地址 Go 没有异常机制,但有 panic/recover 模式来处理错误
Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效 */ import (
"fmt"
) func main1() {
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c") //acb,相反顺序逐个执行,先进后出,
} func main2() {
fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c") for i := ; i < ; i++ {
defer fmt.Println(i)
} // a 2 1 0 c b
} func main3() {
for i := ; i < ; i++ {
defer func() {
fmt.Println(i)
}() // 3 3 3,for循环结束的时候i=3,而当main函数结束的时候开始执行defer,此时i一直是3(存在闭包)
}
} //go语言没有异常机制,也就是没有try catch,defer就类似于finally,
//go语言的异常机制是panic/recover 模式来处理错误,Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效
//函数发生错误的时候,函数已经不执行了,只能靠defer来执行一些恢复操作,所以recover只能放在defer调用的函数中才是有意义的。 func main4() {
A()
B()
C() //AAAAAAA, panic:BBBBBBBB
} func A() {
fmt.Println("AAAAAAA")
} func B() {
panic("BBBBBBBB") //B已经panic了,C函数不执行,程序终止执行了,
} func C() {
fmt.Println("VCCCCCC")
} func main() {
A1()
B1()
C1()
//AAAAAAA recover in B VCCCCCC
//通过defer将程序从panic状态恢复回来,恢复到正常执行,
} func A1() {
fmt.Println("AAAAAAA")
} func B1() {
//恢复panic,要写在panic之前,因为如果执行了panic了后面的代码不再执行了,
//那么defer就注册不了recover函数了,(defer函数是在函数执行完之后执行的,相当于只是注册了里面的一些函数)
defer func() {
if err := recover(); err != nil { //err为函数中出现的错误,err不为空,引发了panic,说明revcover有效,恢复panic,
fmt.Println("recover in B")
}
}()
panic("BBBBBBBB") //B已经panic了,C函数不执行,程序终止执行了,
} func C1() {
fmt.Println("VCCCCCC")
}

slice和map是引用类型,

匿名函数不能作为顶级函数,只能够放在函数里面,

panic和recover类似于其他语言的try catch,用于异常的返回和错误的处理  。出现了错误panic,要从错误中恢复过来,  程序进入panic之后函数不再执行(类似于发生了错误跑出了异常),要想在panic之后仍然能够执行recover函数就需要用到defer,defer是不管任何情况都会执行用defer定义的函数,将recover放在defer中,并且defer要放在可能发生panic的语句之前,

go09---defer的更多相关文章

  1. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  2. javascript的defer和async的区别。

    我们常用的script标签,有两个和性能.js文件下载执行相关的属性:defer和async defer的含义[摘自https://developer.mozilla.org/En/HTML/Elem ...

  3. script标签中defer和async属性的区别

    这篇文章来源于JS高级程序设计第三版中关于script标签的介绍,结合查阅的资料写下的学习笔记. 向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一 ...

  4. twitter.common.concurrent deadline and defer

    此defer非golang中的defer https://tour.golang.org/flowcontrol/12 from twitter.common.concurrent import Ti ...

  5. script async 和script defer的区别

    浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...

  6. angular中的$q.defer()服务异步处理

    jquery和angular都有defer服务,我暂以angular为例谈谈我的理解,最后并附上jquery的阮一峰总结的defer. 以我目前项目的部分代码为例说明为什么要用deferred. fu ...

  7. Go语言异常处理defer\panic\recover

    Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...

  8. 浅谈JavaScript中的defer,async

    引言 开始重读<<JavaScript高级程序设计>>一书,看到关于JavaScript中关于defer.async的部分.网上查询了点资料,觉得蛮好的.现在总结下. defe ...

  9. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  10. go:defer

    defer:延迟. 假设有调用函数A.被调用函数B,其关系如下: func A(){//调用函数 ... defer B()//被调用函数 ... return//B将延迟到return前执行 } * ...

随机推荐

  1. php扩展1:filp/whoops(用于调试,方便定位错误点)

    一.composer下载filp/whoops: 1.在composer.json中添加:"filp/whoops": "*",如下所示: 2.执行compos ...

  2. PHP:Mysql 基础类

    文章来源:http://www.cnblogs.com/hello-tl/p/7592547.html <?php /** * __construct($Mysql_config) 构造函数 $ ...

  3. Python-基本图形绘制及库引用

    turtle库的使用 概述:turtle(海龟)库是turtle绘图体系的python实现 turtle库的理解: -有一只海龟,其实在窗体正中心,在画布上游走 -走过的轨迹形成了绘制的图形 -海龟由 ...

  4. Lucene_Hello(示例)

    (1)创建project (2)导入Lucene的核心包 (3)编写代码建立索引 /lucene01/src/cn/hk/lucene/TestIndex.java: package cn.hk.lu ...

  5. 使用回溯法解批处理作业调度问题<算法分析>

    一.实验内容及要求 1.要求用回溯法原理求解问题: 2.要求手工输入t1[10]及t2[10],t1[i]是任务i在机器1上的执行时间,t2[i]是任务i在机器2上的执行时间: 3.求出最优批处理作业 ...

  6. CSU 1259 bfs找最短路

    题目大意: 不想介绍,题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1259 bfs求最短路. 这里因为2-9,到达同样的点不计步数,那我 ...

  7. codeforces 362B

    #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(int ...

  8. hdu3592(差分约束) (线性)

    题意:一些牛按序号排成一条直线,有两种要求,A和B距离不得超过X,还有一种是A和B距离不得少于Y,问1和N可能的最大距离. 和poj那题一样,就是多了多组数据. #include<cstring ...

  9. 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)

    题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...

  10. 【Tomcat】tomcat启动后查看运行时JVM参数

    Tomcat优化配置参考http://www.cnblogs.com/qlqwjy/p/8007490.html 1.启动服务后访问localhost,点击Server Status