阐述一下Golang中defer的原理

基本用法

在Go语言中,defer关键字用于在函数返回前执行一段代码或调用一个清理函数。这对于处理文件关闭、解锁或者返回一些资源到资源池等操作非常有用。

其基本用法如下所示:

package mainimport "fmt"func main() {example()
}func example() {defer fmt.Println("world")fmt.Println("hello")
}

defer fmt.Println("world")语句会在函数example返回之前执行,所以输出的结果是:

在这里插入图片描述

执行顺序

当我们在一个函数内部调用defer关键字,Go实际上会把它后面的函数(通常是一个匿名函数或者清理函数)压入一个栈中。当外部函数准备返回的时候,Go会按照先进先出的(LIFO)的顺序调用并执行这个栈中的所有函数。

比如,如下示例:

package mainimport "fmt"func main() {example()
}func example() {defer fmt.Println("first")defer fmt.Println("second")defer fmt.Println("third")fmt.Println("function body")
}

其输出结果为:在这里插入图片描述

参数计算时机

需要注意的是,defer语句的参数会在defer语句处就计算好,而不是在外部函数返回时才计算。比如如下例子

package mainimport "fmt"func main() {example()
}func example() {i := 0defer fmt.Println(i) i++fmt.Println(i)
}
/*
1
0
*/

实际应用举例

关闭文件
package mainimport ("fmt""io/ioutil""os"
)func readFile(fileName string) (string, error) {file, err := os.Open(fileName)if err != nil {return "", err}defer file.Close() // 确保文件在函数返回前被关闭content, err := ioutil.ReadAll(file)if err != nil {return "", err}return string(content), nil
}func main() {content, err := readFile("example.txt")if err != nil {fmt.Println("Error:", err)return}fmt.Println("File content:", content)
}
解锁互斥锁
package mainimport ("fmt""sync"
)var mtx sync.Mutex
var cnt intconst N int = 10func increment() {mtx.Lock()defer mtx.Unlock()cnt++
}func main() {var wg sync.WaitGroupfor i := 0; i < N; i++ {wg.Add(1)go func() {defer wg.Done()increment()}()}wg.Wait()fmt.Println("Final count: ", cnt)
}
释放网络连接
package mainimport ("fmt""io/ioutil""net/http"
)func fetchURL(url string) (string, error) {resp, err := http.Get(url)if err != nil {return "", err}defer resp.Body.Close() // 确保连接在函数返回前被关闭body, err := ioutil.ReadAll(resp.Body)if err != nil {return "", err}return string(body), nil
}func main() {content, err := fetchURL("http://baidu.com")if err != nil {fmt.Println("Error:", err)return}fmt.Println("URL content:", content)
}

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Rekono结合多种工具自动完成渗透测试

关于Rekono Rekono是一款功能强大的自动化渗透测试工具&#xff0c;该工具能够结合其他多种网络安全工具并以自动化的形式完成整个渗透测试过程。在工具运行的过程中所收集到的数据将通过电子邮件或Telegram同时发送给用户&#xff0c;如果需要更加高级的漏洞管理功能&#xf…

浏览器(Browser):轻量级浏览器,高效浏览新体验

在可的哥桌面&#xff08;Codigger Desktop&#xff09;&#xff0c;我们始终秉持创新精神&#xff0c;致力于提供卓越的用户体验。如今&#xff0c;我们激动地宣布一项全新功能的发布——轻量级浏览器Browser。这款浏览器的推出&#xff0c;正是我们对用户体验追求的再次体现&…

设施布置之车间布局优化SLP分析

一 物流分析&#xff08;Flow Analysis&#xff09; 的基本方法 1、当物料移动是工艺过程的主要部分时&#xff0c;物流分析就是工厂布置设计的核心工作&#xff0c;也是物料搬运分析的开始。 2、零部件物流是该部件在工厂内移动时所走过的路线&#xff0c; 物流分析不仅要考虑…

智慧水务十大预测

智慧水务是指利用现代信息技术&#xff0c;如物联网(IoT)、大数据、云计算、人工智能(AI)等&#xff0c;对水务系统进行智能化改造和管理&#xff0c;以提高水资源的利用效率、保障供水安全、降低运营成本和环境影响。以下是对智慧水务未来发展的十大预测&#xff1a; 数字化转…

免费ai写作?这三款软件是你的好帮手!

在信息爆炸的今天&#xff0c;自媒体已成为越来越多人展现自我、分享知识的平台。然而&#xff0c;对于许多自媒体创作者来说&#xff0c;写作过程中的灵感枯竭、文笔不畅等问题常常困扰着他们。幸运的是&#xff0c;随着人工智能技术的飞速发展&#xff0c;免费AI写作软件应运…

小程序onLoad 和 onShow

onLoad 和 onShow 是小程序页面的生命周期函数&#xff0c;它们在不同的时机触发&#xff0c;具有不同的用途和执行顺序 1.onLoad: &#xff08;1&#xff09;onLoad 在页面加载时触发&#xff0c;仅执行一次。 &#xff08;2&#xff09;用于页面的初始化操作&#xff0c;例如…

2024全国高校名单发布,电子版下载!

今天&#xff0c;教育部网站发布了《全国高等学校名单》。截至2024年6月20日&#xff0c;全国高等学校共计3117所&#xff0c;其中&#xff1a;普通高等学校2868所&#xff0c;含本科学校1308所、高职&#xff08;专科&#xff09;学校1560所&#xff1b;成人高等学校249所。本…

java试卷练习1

试卷练习1 一、单项选择题。 在每小题列出的四个备选项中只有一个选项是符合目的要求的&#xff0c;请将其代码填写在 题后的括号内。 1、Java 语言中&#xff0c;byte 类型占用的二进制位数是&#xff1a;&#xff08;D&#xff09; A、1 位 B、2 位 C、4 位 D、8 位 解释…

任务4.8.3 利用SparkSQL统计每日新增用户

实战概述&#xff1a;利用SparkSQL统计每日新增用户 任务背景 在大数据时代&#xff0c;快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据&#xff0c;以统计每日新增用户数量。 任务目标 处理用户访问历史数…

简单了解雪花算法

雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位&#xff0c;分别是 时间戳 服务器节点ID 序列号&#xff0c;每个数据项占的位数不固定&#xff0c;可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…

数字样机:飞行器状态控制系统仿真

引言&#xff1a;数字样机起源于20世纪90年代&#xff0c;是一种用数字化模型代替实际物理样机进行仿真分析的技术。 传统的飞行器研发流程往往遵循一套特定的循环结构&#xff1a;在设计初期&#xff0c;工程人员需要对飞行器提供一个综合的设计思路&#xff08;初期蓝图&…

“河南省勘察设计资质整合趋势与企业应对“

"河南省勘察设计资质整合趋势与企业应对" 河南省勘察设计资质的整合趋势与企业应对策略可以从以下几个方面来分析&#xff1a; 整合趋势&#xff1a; 资质标准简化与合并&#xff1a;随着国家和地方政府深化“放管服”改革&#xff0c;勘察设计资质的管理趋向简化&…

Linux【实操篇-文件目录类命令】

05【实操篇-文件目录类命令】 1.pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 到现在为止&#xff0c;我们还不知道自己在系统的什么地方。在浏览器上&#xff0c;我们能够通过导航栏上的url&#xff0c;了解到自己在互联网上的具体坐标。相似的…

Linux权限理解

目录 一.权限的概念 二.Linux权限管理 1.文件访问者的分类&#xff08;人&#xff09; 2.文件类型和访问权限&#xff08;事物属性&#xff09; 3.文件权限值的表示方法 4.文件访问权限的相关设置方法 5.修改文件的拥有者 6.修改文件所属组 7.查看或修改文件权限掩码 …

轻松解决Android复杂数据结构序列化

问题描述 当我编写quickupload库时&#xff0c;因为需要在 Service中进行上传任务&#xff0c;向Service传递时我发现需要传递的数据很多并且结构复杂&#xff0c;如果处理不好就会导致以下几个问题 耗时: 需要更多时间进行开发和测试以确保正确的数据处理。容易出错: 由于手…

C语言:指针笔试题

// 输入某一年的第几天&#xff0c;计算并输出它是这一年的第几月第几日。 /* 函数功能: 对给定的某一年的第几天&#xff0c;计算它是这一年的第几月第几日。 函数入口参数: 整形变量year,存储年&#xff1b; 整形变量yearDay,存储某一年的第几天&am…

【ubuntu】用户添加root权限

添加root用户添加新用户并赋予权限 文件只读&#xff0c;无法更改 rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# vi /etc/sudoers rootubuntu-server:/home/ubuntu# chmod -R 777 /etc/sudoers rootubuntu-server:/home/ubuntu# vi /et…

vue3+Vite项目中引入Element plus组件库及基本使用步骤

一、Element Plus组件库介绍 Element Plus组件库饿了么团队为Vue3发布的组件库&#xff0c;它含有丰富的样式&#xff0c;该组件的官网&#xff1a;element-plus。 二、Element Plus组件安装 (1)通过vscode打开创建的vue项目&#xff0c;本文的项目名称为“shop-admin”,打开项…

56.SQLSERVER中字段,变量判断为空和空字符串

一、字段判断 &#xff08;1&#xff09;是否为空 select * from department where leader is NULL select * from department where leader is not NULL &#xff08;2&#xff09;是否为空字符‘’ select * from department where leader select * from department wh…

微信小程序/uni-app tabBar 页面传参问题

先看下他们的文档 1、微信小程序 https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab.html 需要跳转的 tabBar 页面的路径 (代码包路径)&#xff08;需在 app.json 的 tabBar 字段定义的页面&#xff09;&#xff0c;路径后不能带参数。 2、uni-app …