Golang开发--defer关键字

defer是Go语言中的一个关键字,用于延迟执行函数或方法的调用。defer语句会将其后面的函数或方法调用推迟到当前函数返回之前执行,无论函数是正常返回还是发生异常。

func main() {defer fmt.Println("defer 1")defer fmt.Println("defer 2")fmt.Println("Hello, World!")
}

输出结果为:

Hello, World!
defer 2
defer 1

可以看到,"Hello, World!"是先输出的,而defer语句中的函数调用是在main函数返回之前执行的,且按照声明顺序的相反顺序执行。

defer的作用主要有以下几个方面:

  1. 资源释放:defer语句常用于释放资源,比如关闭文件、关闭数据库连接等。通过在打开资源后使用defer语句,可以确保在函数返回之前一定会执行资源释放操作,避免资源泄漏。
func readFile() {file, err := os.Open("filename.txt")if err != nil {fmt.Println("Error:", err)return}defer file.Close()// 读取文件并进行其他操作
}

在上面的示例中,使用 defer 语句将 file.Close() 推迟到函数返回之前执行,无论函数返回时是正常执行还是发生错误,都能确保文件被关闭,避免资源泄漏。

2.解锁操作:在使用互斥锁(mutex)或读写锁(RWMutex)的情况下,使用 defer 语句延迟解锁,以避免忘记解锁而导致死锁。例如:

var mu sync.Mutexfunc someFunction() {mu.Lock()defer mu.Unlock()// 临界区代码
}

在上面的示例中,使用 defer 语句将 mu.Unlock() 推迟到函数返回之前执行,确保在函数退出时解锁互斥锁。

  1. 错误处理:defer语句也可以用于处理错误。在函数中可能会发生多个错误,但只有最后一个错误需要处理,可以使用defer语句将错误处理代码推迟到函数返回之前执行,确保错误处理代码只会执行一次。
func process() error {err := setup()if err != nil {return err}defer cleanup()// 其他操作return nil
}

在上面的示例中,cleanup() 函数会在 process() 函数退出前被推迟执行,无论是正常返回还是发生错误。

  1. 日志记录:defer语句还可以用于记录日志。在函数中可能会有多个地方需要记录日志,但只需要在函数返回之前记录一次即可,可以使用defer语句将日志记录代码推迟到函数返回之前执行。

使用defer语句的方法如下:

  1. 在函数中使用defer语句时,需要在调用函数或方法的语句前面加上defer关键字。

  2. 可以使用多个defer语句,它们的执行顺序与声明顺序相反,即最后一个defer语句最先执行。

  3. defer语句中的函数或方法调用可以包含参数,这些参数会在defer语句执行时被计算并保存,但实际调用时会使用当前的参数值。

  4. defer 语句中的函数参数会在 defer 语句执行时求值,而不是在函数返回时求值。这意味着,如果 defer 语句中的函数调用有参数,参数的值在 defer 语句执行时就会被确定。

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

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

相关文章

企业架构LNMP学习笔记61

Nginx作为tomcat的前段反向代理: 在实际业务环境中,用户是直接通过域名访问,基于协议一般是http、https等。默认tomcat运行在8080端口。一般会通过前端服务器反向代理到后端的tomcat的方式,来实现用户可以通过域名访问tomcat的we…

微信收款码费率0.38太坑了

作为一个有多年运营经验的商家,我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司,但了解到的收款手续费率通常都在0.6左右,最低也只能降到0.38。这个过程吃过不少苦头。毕竟,收款功能是我们商家的命脉&…

AI聊天ChatGPT系统源码卡密验证开源版

ChatGPT卡密验证版源码是一个基于PHP7.4和MySQL5.6的聊天AI源码,它不仅支持暗黑模式、反应速度极快,而且充值方面采用后台生成卡密方式,方便快捷,如果您有能力将其接入在线支付,即可进一步拓展充值方式,为更…

KMeans算法全面解析与应用案例

目录 一、聚类与KMeans介绍聚类的基础概念KMeans算法的重要性 二、KMeans算法原理数据集和特征空间距离度量算法步骤 三、KMeans案例实战案例背景:客户细分数据集说明Python实现代码输出与解释 四、KMeans的优缺点优点计算效率高算法简单易于实现 缺点需要预设K值对…

9月22日上课内容 Docker

Docker 基本管理 docker 发展历史 https://www.cnblogs.com/rongba/articles/14782624.html Docker 概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟…

一、机器学习基础知识:基本概念与Python开发环境

文章目录 1、机器学习的不同类型1.1 监督学习1.2 无监督学习1.3 强化学习 2、Python开发环境2.1 Python第三方库2.2 AnacondaPycharm集成开发环境 1、机器学习的不同类型 机器学习属于人工智能的一个分支,专门用于对数据进行自动分析以发现相关规律,从而…

视频监控/视频汇聚/安防视频监控平台EasyCVR配置集群后有一台显示离线是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

leetcode 55. 跳跃游戏

题目链接:leetcode 55 1.题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则&#x…

芯片验证就是一次旅行

如果你国庆希望去一个你不曾去过的城市旅行,比如“中国苏州”。对游客来说,它是个蛮大的城市,有许多景点可以游玩,还有许多事情可以做。但实际上,即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…

肖sir__mysql中数据库后端无法展示

mysql中数据库后端无法展示: 错误现象 解决方法: mysql中数据库后端无法展示:my.cnf (5,7数据库) 在 mysql 配置文件中加入: sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 或者重启数据库

Android Kotlin 基础详解

1,基础语法 1.1 可变变量与不可变变量 可以多次赋值的变量是可变变量&#xff0c;用关键字var表示&#xff1a; var <标识符> : <类型> <初始化值> 注意&#xff0c;在kotlin中成员变量不会赋默认值&#xff0c;不像java一样&#xff0c;必须手动添加默…

Android12之容器类SortedVector、KeyedVector、Vector、VectorImpl总结(一百六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Centos 7 访问局域网windows共享文件夹

Refer: centos7 访问windows系统的共享文件夹_centos访问windows共享_三希的博客-CSDN博客 一、在CentOS中配置CIFS网络存储服务 CIFS&#xff08;Common Internet File System&#xff09;是一种在网络上共享文件的协议&#xff0c;也称为SMB&#xff08;Server Message Blo…

rabbit start 启动和 detached 启动区别

使用 rabbitmq-server -start 命令启动 RabbitMQ 时&#xff0c;RabbitMQ 服务器将在前台运行&#xff0c;并将日志输出到终端。在这种模式下&#xff0c;如果终端关闭&#xff0c;RabbitMQ 服务器也会停止运行。&#xff08;就是管理命令窗口关闭 rabbit就会停止服务&#xff…

「大数据-2.1」HDFS集群启停命令

目录 一、HDFS集群一键启停脚本 1. HDFS集群的一键启动脚本 2. HDFS集群的一键关闭脚本 二、单进程启停 1. hadoop-daemon.sh脚本 2. hdfs脚本 三、总结 1. 一键启停脚本 2. 独立进程启停 一、HDFS集群一键启停脚本 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 1. HDFS集群…

ubuntu20.04 jammy 安装ros2

ubunut22.04 jammy&#xff08;5.15&#xff09; ros2版本: humble 安装参考&#xff1a; Ubuntu (Debian packages) — ROS 2 Documentation: Humble documentationl 按照官方给的操作指南进行操作即可&#xff0c;到安装软件包的时候&#xff0c;若只为开发&#xff0…

【LeetCode热题100】--56.合并区间

56.合并区间 排序&#xff1a; 如果按照区间的左端点排序&#xff0c;那么在排完序的列表中&#xff0c;可以合并的区间一定是连续的&#xff0c;如下图所示&#xff0c;标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间&#xff0c;它们在排完序的列表中是连续的 算法&a…

安科瑞AMC16-DETT铁塔jizhan直流电能计量模块,直流计量用

安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁 9月20日&#xff0c;在杭州亚运会火炬传递的现场&#xff0c;不少人通过网络与亲友连线&#xff0c;共同见证火炬传递的历史时刻。上午6时&#xff0c;杭州铁塔的一线通信保障人员共27人就已经在本次火炬传递收官点位奥体中心西广场附近&a…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序&#xff1a; ① 当前运行的进程&#xff1a;陷阱程序&#xff08;系统调用&#xff09; 和 故障程序&#xff08;page fault&#xff09; &#xff0c;进程运行在内核态的时候&#xff0c;其实就是在执行进程在用户态触发的…

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…