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. centOS取消锁屏

    自己在使用虚拟机运行centos 7时,centos 7默认几分钟不动就锁屏,实在很讨厌,所以在设置中将其去掉 1.左上角点击应用程序,在下面选择系统工具,在系统工具中选择设置 2.选择设置下面的隐私 ...

  2. [Python3网络爬虫开发实战] 1.7.2-mitmproxy的安装

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...

  3. LINUX:Contos7.0 / 7.2 LAMP+R 下载安装Mysql篇

    文章来源:http://www.cnblogs.com/hello-tl/p/7569097.html 更新时间:2017-09-21 16:06 简介 LAMP+R指Linux+Apache+Mys ...

  4. list嵌套,int与str的用法,replace

    #*************************replace(待改,改动值),返回很重要 A = [['libai',89]] A[0][0]=A[0][0].replace('a','af') ...

  5. 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小

    用处 基于SVD实现模型压缩以适配低功耗平台     根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...

  6. 【03】Html书写规范

    [03]   Html书写规范   1.推荐使用html5的文档声明 <!DOCTYPE HTML> 2.必须申明文档的编码charset,且与文件本身编码保持一致,推荐使用UTF-8编码 ...

  7. 下载Spring4.1.x源码并用IntelliJ IDEA打开-----

    下载Spring4.1.x源码并用IntelliJ IDEA打开-------https://blog.csdn.net/boling_cavalry/article/details/79426075 ...

  8. HDU 5458 Stability

    Stability Time Limit: 2000ms Memory Limit: 102400KB This problem will be judged on HDU. Original ID: ...

  9. [SPOJ7258]Lexicographical Substring Search

    [SPOJ7258]Lexicographical Substring Search 试题描述 Little Daniel loves to play with strings! He always ...

  10. 在 Windows 10 64 下安装 Memcached,安装 PHP 7.0.22 的 Memcache 扩展

    1.之前写过一篇在 PHP 5.6.27 下的博客:http://www.shuijingwanwq.com/2017/09/11/1892/ ,此次是 PHP 7.0.22 下的,如图1 图1 2. ...