Golang语言延迟函数defer用法分析

本文实例讲述了GO语言延迟函数defer用法。分享给大家供大家参考。具体分析如下:

defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理、释放资源、清理数据、记录日志等。这有点像面向对象语言的析构函数,优雅又简洁,是 Golang 的亮点之一。

代码1:了解 defer 的执行顺序

package main
import "fmt"
func fn(n int) int {
 defer func() {
  n++
  fmt.Println("3st:", n)
 }()
 defer func() {
  n++
  fmt.Println("2st:", n)
 }()
 defer func() {
  n++
  fmt.Println("1st:", n)
 }()
 return n //没有做任何事情
}
func main() {
 fmt.Println("函数返回值:", fn(0))
}

输出:

1st: 1 2st: 2 3st: 3 函数返回值: 0

代码2:经典应用实例

func CopyFile(dst, src string) (w int64, err error) {
 srcFile, err := os.Open(src)
 if err != nil {
  return
 }
 defer srcFile.Close() //每次申请资源时,请习惯立即申请一个 defer 关闭资源,这样就不会忘记释放资源了
 dstFile, err := os.Create(dst)
 if err != nil {
  return
 }
 defer dstFile.Close()
 return io.Copy(dstFile, srcFile)
}

defer 还有一个重要的特性,就是即便函数抛出了异常,也会被执行的。 这样就不会因程序出现了错误,而导致资源不会释放了。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

Python新手快速入门教程-基础语法

交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。

871
来自专栏HTML5学堂

拉手网面试题,不一样的难度

正文 1、JavaScriptalert(0.4*0.2);结果是多少?和你预期的一样吗?如果不一样该如何处理? 2、JavaScript以下哪条语句会产生运行...

3608
来自专栏Theo Tsao

Vim的基本使用(一)

本文包含Vim的基本使用有: 移动光标、屏幕滚动、模式查找、位置标记、删除文本、撤销与重做、插入文本、复制与移动、修改文本、写入与退出。

1023
来自专栏烂笔头

Python标准库笔记(6) — struct模块

目录[-] 该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换。这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其...

4715
来自专栏用户2442861的专栏

shell脚本方便操作记录(持续添加)

http://blog.csdn.net/richerg85/article/details/44001501

2171
来自专栏生信宝典

Bash概论 - Linux系列教程补充篇

本篇是我最开始学习Linux命令时看的一篇帖子,最早见于ChinaUnix (这次查找其出处时发现2002年就有这篇)。学习过程中,遇到问题就查一下。这次看到,...

1967
来自专栏达摩兵的技术空间

数组双向绑定的简单分享

本文主要是摘录《vuejs权威指南》部分的相关解读,我们都知道vue对数据支持双向绑定,对数组也是支持的,但是其在官网有明确说明,对于数组通过 对象.语法来修改...

1172
来自专栏北京马哥教育

Linux内核中container_of函数详解

在Linux 内核中,container_of 函数使用非常广,例如 Linux内核链表 list_head、工作队列work_struct中 在Linux 内...

2549
来自专栏刺客博客

使用sed命令在两行匹配之间插入一行新内容

在这两个之间插入一行liming。 解决办法: 查了一下sed的用法貌似可以试一下,看到命令n可以读入下一行到pattern space,就可一匹配完前一行...

1092
来自专栏黄Java的地盘

eventEmitter3源码分析与学习

事件监听在前端的开发过程中是一个很常见的情况。DOM上的事件监听方式,让我们看到了通过事件的方式来进行具体的业务逻辑的处理的便捷。

1241

扫码关注云+社区

领取腾讯云代金券