[日常] Go语言圣经-Deferred函数
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函数相关推荐
- [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题
go语言圣经-声明 1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明 2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明 ...
- [日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...
- [日常] Go语言圣经--Channel习题
练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接.一个TCP连接有读和写两个部分,可以使用Clos ...
- [日常] Go语言圣经-GIF动画练习语法
1.常量声明的值必须是一个数字值.字符串或者一个固定的boolean值. 2.常量声明和变量声明一般都会出现在包级别 3.[]color.Color{...}生成的是一个slice切片和gif.GIF ...
- [日常] Go语言圣经-基于select的多路复用习题
练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接. reverb3.go package mainimport ...
- GO语言圣经习题:5.2 函数递归
GO语言圣经:函数递归 习题解析 <GO语言圣经>:https://books.studygolang.com/gopl-zh/ch5/ch5-02.html 第五章函数.递归习题与解析 ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- Go函数及与函数相关机制 【Go语言圣经笔记】
函数 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用.函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间.不同地方独立完成.一个函数 ...
- Go语言圣经 - 第5章 函数 - 5.10 Recover捕获异常
第5章 函数 函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务.前面我们已经接触过函数,本章我们将讨论函数的更多特性 5.1 ...
最新文章
- LaTeX入门最终集 :LaTeX格式的调整LaTeX中怎么打出数学公式LaTeX的各种上下标
- java 银行项目对于金额的面试题_2019年面试题小结
- MapReduce 踩坑 - hadoop No FileSystem for scheme: file/hdfs
- java 双等号(==) 与equals方法的使用区别
- java怎么让窗口居中显示图片_Java_Swing中让窗口居中显示的方法(三种方法)
- html5 制作商品显示介绍,HTML5+CSS3:3D展示商品信息示例
- 这篇文章,专治MQ中间件各种疑难杂症
- java单链表_(java实现)单链表
- (转)mysql同步复制
- 大数据之-Hadoop3.x_MapReduce_MapJoin案例需求分析---大数据之hadoop3.x工作笔记0133
- 无人车前轮转向分辨率校准
- 移动零售批发行业新的技术特色-智能PDA手持移动扫描打印销售开单收银仪!!...
- ai人工智能的本质和未来_什么是人工智能,它将如何塑造我们的未来?
- CCS7.0从安装到使用
- RFID(Radio Frequency Identification)技术,又称无线射频识别
- 应用程序无法正常启动(oxc000007b)
- R包学习——reshape包中melt、cast、merge函数用法
- JZ2440开发板之GPIO实验,遇到的链接语句、设置寄存器的问题
- [Unity3D]上海某大型游戏公司的基础面试题
- 【opencv学习】银行卡的识别
热门文章
- saltstack 服务配置
- ORACLE学习笔记--性能优化2
- Webpack 4.0 打包 Vue 应用时出现无法使用Vue-loader问题及解决方法
- 数字资产交易所IM即时通讯社交系统APP开发
- 分页技巧_实现第一个分页功能(回复列表中的分页)
- ansible 发部署nginx以及更新、回滚
- Cisco与Linux的NAT
- Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)
- shell中的for循环语句
- (十一)java版spring cloud+spring boot+redis多租户社交电子商务平台- commonservice-sso服务搭建(一)...