go语言---defer
go语言---defer
https://blog.csdn.net/cyk2396/article/details/78885135
- defer 是在函数退出前调用,多个defer遵循 先进后出 的原则调用;常用来做资源清理,关闭文件,解锁等操作
func deferTest() {
defer func() {
fmt.Println("func1...")
}()
func() {
fmt.Println("func2...")
}()
defer func() {
fmt.Println("func3...")
}()
}
- defer调用所需参数在defer语句被压入栈中时获得(拷贝值),尽管defer语句是在函数返回前真正执行
func main() {
x := 5
defer fmt.Println("println=", x)
defer func(y int) {
fmt.Println("func=", y)
}(x)
x += 10
fmt.Println(x)
}
- 输出结果:
15
func= 5
println= 5
- defer函数能够读取外围函数的返回值并进行更改操作
func main() {
v := c()
fmt.Println(v)
}
func c() (i int) {
defer func() { i++ }()
return 1
}
输出结果:
2
以上代码c()函数可以解析为:
1.将defer函数压入栈中
2.给返回值i赋值为1,即i=1
3.执行defer函数,修改返回值i
4.执行空的return,即return;
- 看以下demo:
func main() {
v := c()
fmt.Println(v)
}
func c() (i int) {
x := 1
defer func(x int) { x++ }(x)
return x
}
输出结果:
1
上面函数c()这段代码可以解析为:
1.给变量x赋值为1
2.将defer函数压入栈中,同时拷贝变量x的值给defer函数中的x(注意:这是两个不同的x)
3.给返回值i赋值为x,即i = 1
4.执行defer函数,defer函数中的x为2(外围函数中的x值仍然为1)
5.执行return;
- 总结:
1.当执行到defer语句时,会先把它压入栈中,此时以值传递的方式获取defer语句所需要的参数,等它的外围函数返回前,开始按 先进后出 的原则执行defer语句
2.return xxx;语句并不是一个原子操作,当有defer语句时,return xxx可以解释为: 先给返回值赋值,然后执行defer语句,最后执行空的return。所以defer语句有可能更改返回值。
go语言---defer的更多相关文章
- go语言 defer 高级
go语言defer语句的用法 defer的语法 defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错. package main import "log" func ...
- go语言defer使用
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...
- go语言 defer 你不知道的秘密!
go 语言的defer功能强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.我们先来看几个例子. 例一: defer 是先进后出 这个很自然,后面的语句会依赖前面的资源,因此如果先前面的资源先 ...
- go语言defer关键字背后的实现,语法,用法
原文: https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html ------------------------------ ...
- 探究 Go 语言 defer 语句的三种机制
Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer ...
- 深入 Go 语言 defer 实现原理
转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/523 本文使用的go的源码 1.15.7 介绍 defer 执行规 ...
- go语言defer panic recover用法总结
defer defer是go提供的一种资源处理的方式.defer的用法遵循3个原则 在defer表达式被运算的同时,defer函数的参数也会被运算.如下defer的表达式println运算的同时,其入 ...
- Go 语言defer用法
defer延迟调用: 1.确保调用在函数结束时发生: 2.defer列表为先进后出: 3.通常在Open/Close Lock/Unlock中使用. defer调用顺序示例: package mai ...
- Go语言defer分析
什么是defer? defer语句是专门在函数结束以后做一些清理工作的.我们先举一个例子来更好的理解,现在有一个函数,它的作用是把一个文件内容拷贝到另一个文件. func CopyFile(dstNa ...
随机推荐
- SpringBoot 全局处理以及注入请求参数
后端接口,经常会用token获取对应的账号信息.于是考虑将这个步骤封装起来. 之前项目使用ThreadLocal去做这样的事情,但昨天看SpringBoot的官方文档,发现借助框架的功能也可以做这样的 ...
- mysql主库与从库配置(并行复制配置)
主库: [mysqld] server-id = 2233port = 13306basedir = /usr/local/mysqldatadir = /usr/local/mysql/data s ...
- 零基础入门学习Python(34)--丰富的else语句及简洁的with语句
知识点 else语句的用法: 1)配合if语句 if a>b: print(a) else: print(b) 2)配合while和for循环 只在循环完成后才执行,如果循环中执行使用到brea ...
- ThinkPHP5.X PHP5.6.27-nts + Apache 通过 URL 重写来隐藏入口文件 index.php
我们先来看看官方手册给出关于「URL 重写」的参考: 可以通过 URL 重写隐藏应用的入口文件 index.php ,Apache 的配置参考: 1.http.conf 配置文件加载 mod_rewr ...
- Python解释器的种类以及特点
CPython 由C语言开发的 使用最广的解释器 IPython 基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样 PyPy 目标是执行效率 采用JIT技术 对pyt ...
- CodeForcesGym 100517H Hentium Scheduling
Hentium Scheduling Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...
- 2015 湘潭大学程序设计比赛(Internet)部分题解,其中有一个题与NYOJ1057很像,贪心过~~
仙剑奇侠传 祝玩的开心 ...
- [luoguP1040] 加分二叉树(DP)
传送门 区间DP水题 代码 #include <cstdio> #include <iostream> #define N 41 #define max(x, y) ((x) ...
- request详究
本文主要是对在学习过程中遇到的request用法进行归纳总结,彻底的搞明白request在jsp中的作用. 百度百科的介绍如下: Request对象的作用是与客户端交互,收集客户端的Form.Cook ...
- codevs——1013 求先序排列
1013 求先序排列 2001年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出 ...