前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go defer学习笔记

Go defer学习笔记

原创
作者头像
smartfly
修改2019-02-12 17:30:13
6850
修改2019-02-12 17:30:13
举报
文章被收录于专栏:smartfly学习笔记smartfly学习笔记

概述

关于defer说明,官方文档这样描述:

A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a return statement, reached the end of its function body, or because the corresponding goroutine is panicking.

该说明调用defer函数用于释放资源,会在函数返回之前那一刻执行。即使goroutine产生painc。

使用场景

在开发过程中,我们经常使用defer命令字。比如在连接数据库、加锁等操作时候,会使用defer来释放数据库资源、释放锁等。

  • 释放资源场景
代码语言:txt
复制
rows, err := handler.Query(sql)
if err != nil {
    Errorln("Mysql query error, msg:%s ", err.Error())
    return
}
defer rows.Close()
  • 释放锁的场景
代码语言:txt
复制
updateShareMutex.Lock()
defer updateShareMutex.Unlock()

在正常开发场景时候,主要defer关闭资源时候要在判断err之后,避免空指针。比如把释放资源场景中的defer位置放错,会引起空指针异常。

深入学习

如果简单了解defer使用是不够的,尤其是跟带命名的返回参数一起使用时,可能会踩到一些坑。

  • 如果多个defer表达式,调用顺序类似于栈。
代码语言:txt
复制
func b(){
    for i := 0; i < 4; i++ {
        defer fmt.Print(i) // 3210
    }
}
  • 在调用defer语句时候,将计算延迟函数的参数,保留当前值
代码语言:txt
复制
func a(){
	i := 0
	defer fmt.Println(i) // 0
	i++
	return
}
  • 返回值被改变,由于return非原子指令
代码语言:txt
复制
func c() (i int) {
	// return语句不是一条原子调用,return xxx其实是赋值+ret指令
	// i = 1

	// defer被插入到return之前执行,也就是赋返回值和ret指令之间
	defer func() {
		i++
	}()
	// return
	return 1
} // 结果为:2
  • 返回值未被改变
代码语言:txt
复制
func d() (r int){
	t := 5
	// 赋值指令
	// r = t
	defer func(){ // defer被插入到赋值与返回之间执行,这个例子中返回值r没有被修改过
		t = t + 5
	}()
	// return
	return t
}
代码语言:txt
复制
func e() (r int){
	// 给返回值赋值
	// r = 1
	defer func(r int) { // 这里改的r是传值传进去的r, 不会改变要返回的那个r值
		r = r + 5
	}(r)
	// return
	return 1
}

从上面实例分析函数返回的过程是这样的:

  • 给返回值赋值
  • 调用defer表达式
  • 返回到调用函数中

参考资料

Defer statements

Defer, Panic, and Recover

defer关键字

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 使用场景
  • 深入学习
  • 参考资料
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com