1.只需要在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函数会被延迟执行。直到包含该defer语句的函数执行完毕时,defer后的函数才会被执行,不论包含defer语句的函数是通过return正常结束,还是由于panic导致的异常结束

2.defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后

3.defer语句会先调用,defer后面的函数会最后调用,两层函数,配合返回匿名函数函数值实现trace功能
defer trace("bigSlowOperation")()

4.http响应写入文件 n, err = io.Copy(f, resp.Body)

练习5.18:不修改fetch的行为,重写fetch函数,要求使用defer机制关闭文件。

package main//导入io/ioutil和net/http包
import ("fmt""io""os"//"io/ioutil""net/http""strings"//"time""net/url"
)
/*
练习5.18:不修改fetch的行为,重写fetch函数,要求使用defer机制关闭文件。
*/
func main() {//开始时间//start := time.Now()//for循环命令行参数for _, u := range os.Args[1:] {//加入前缀if !strings.HasPrefix(u, "http://") {u = "http://" + u }   res, err := http.Get(u)//判断错误if err != nil {//向标准错误流打印信息fmt.Fprintf(os.Stderr, "fetch:%v \n", err)//终止进程os.Exit(1)}   //使用defer机制defer res.Body.Close()urlObj, _ := url.Parse(u)filename := urlObj.Pathif filename == "/" {filename = "index.html"}   var f *os.Filef, err = os.Create(filename)//使用defer机制/*  我们没有对f.close采用defer机制,因为这会产生一些微妙的错误。许多文件系统,尤其是NFS,写入文件时发生的错误会被延迟到文件关闭时反馈。如果没有检查文件关闭时的反馈信息,可能会导致数
据丢失,而我们还误以为写入操作成功。如果io.Copy和f.close都失败了,我们倾向于将io.Copy的错误信息反馈给调用者,因为它先于f.close发生,更有可能接近问题的本质。*/defer f.Close()_, err = io.Copy(f, res.Body)//判断错误if err != nil {//向标准错误流打印信息fmt.Fprintf(os.Stderr, "fetch:%v \n", err)//终止进程os.Exit(1)}   }
}

  

转载于:https://www.cnblogs.com/taoshihan/p/8877651.html

[日常] Go语言圣经-Deferred函数相关推荐

  1. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...

  2. [日常] Go语言圣经-函数递归习题

    练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...

  3. [日常] Go语言圣经--Channel习题

    练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接.一个TCP连接有读和写两个部分,可以使用Clos ...

  4. [日常] Go语言圣经-GIF动画练习语法

    1.常量声明的值必须是一个数字值.字符串或者一个固定的boolean值. 2.常量声明和变量声明一般都会出现在包级别 3.[]color.Color{...}生成的是一个slice切片和gif.GIF ...

  5. [日常] Go语言圣经-基于select的多路复用习题

    练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接. reverb3.go package mainimport ...

  6. GO语言圣经习题:5.2 函数递归

    GO语言圣经:函数递归 习题解析 <GO语言圣经>:https://books.studygolang.com/gopl-zh/ch5/ch5-02.html 第五章函数.递归习题与解析 ...

  7. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  8. Go函数及与函数相关机制 【Go语言圣经笔记】

    函数 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用.函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间.不同地方独立完成.一个函数 ...

  9. Go语言圣经 - 第5章 函数 - 5.10 Recover捕获异常

    第5章 函数 函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务.前面我们已经接触过函数,本章我们将讨论函数的更多特性 5.1 ...

最新文章

  1. LaTeX入门最终集 :LaTeX格式的调整LaTeX中怎么打出数学公式LaTeX的各种上下标
  2. java 银行项目对于金额的面试题_2019年面试题小结
  3. MapReduce 踩坑 - hadoop No FileSystem for scheme: file/hdfs
  4. java 双等号(==) 与equals方法的使用区别
  5. java怎么让窗口居中显示图片_Java_Swing中让窗口居中显示的方法(三种方法)
  6. html5 制作商品显示介绍,HTML5+CSS3:3D展示商品信息示例
  7. 这篇文章,专治MQ中间件各种疑难杂症
  8. java单链表_(java实现)单链表
  9. (转)mysql同步复制
  10. 大数据之-Hadoop3.x_MapReduce_MapJoin案例需求分析---大数据之hadoop3.x工作笔记0133
  11. 无人车前轮转向分辨率校准
  12. 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!...
  13. ai人工智能的本质和未来_什么是人工智能,它将如何塑造我们的未来?
  14. CCS7.0从安装到使用
  15. RFID(Radio Frequency Identification)技术,又称无线射频识别
  16. 应用程序无法正常启动(oxc000007b)
  17. R包学习——reshape包中melt、cast、merge函数用法
  18. JZ2440开发板之GPIO实验,遇到的链接语句、设置寄存器的问题
  19. [Unity3D]上海某大型游戏公司的基础面试题
  20. 【opencv学习】银行卡的识别

热门文章

  1. saltstack 服务配置
  2. ORACLE学习笔记--性能优化2
  3. Webpack 4.0 打包 Vue 应用时出现无法使用Vue-loader问题及解决方法
  4. 数字资产交易所IM即时通讯社交系统APP开发
  5. 分页技巧_实现第一个分页功能(回复列表中的分页)
  6. ansible 发部署nginx以及更新、回滚
  7. Cisco与Linux的NAT
  8. Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)
  9. shell中的for循环语句
  10. (十一)java版spring cloud+spring boot+redis多租户社交电子商务平台- commonservice-sso服务搭建(一)...