【Go 基础篇】Go语言中的defer关键字:延迟执行与资源管理

在这里插入图片描述

介绍

在Go语言中,defer 是一种用于延迟执行函数调用的关键字。它提供了一种简洁而强大的方式,用于在函数返回之前执行一些必要的清理操作或者释放资源。defer 的灵活性和易用性使得它在Go语言中广泛应用于资源管理、错误处理和代码结构优化等方面。🚀🚀🚀

本篇博客将详细介绍defer 关键字的使用方法、延迟执行的特性、常见应用场景以及一些注意事项。通过深入了解defer,您将能够写出更加清晰、可维护的Go代码,避免资源泄漏和错误处理的问题。

defer 的基本用法

基本语法

defer 关键字用于延迟执行一个函数调用,即使包含defer的函数在执行过程中发生了错误或提前返回,这个被defer的函数仍然会被执行。

func main() {defer fmt.Println("World")fmt.Println("Hello")
}
// 输出:
// Hello
// World

在上述示例中,fmt.Println("World") 函数会在 main() 函数返回前被执行,即使在Hello输出之后。

延迟执行的顺序

如果一个函数中有多个defer语句,它们会以先进后出的顺序被执行。也就是说,最后一个被defer的函数会最先被执行,依此类推。

func main() {defer fmt.Println("First")defer fmt.Println("Second")fmt.Println("Hello")
}
// 输出:
// Hello
// Second
// First

在上述示例中,First 会在 Second 之后被执行。🎈🎈🎈🎈🎈

defer 的应用场景

资源释放

一个重要的应用场景是在函数结束时释放资源,例如关闭文件、关闭数据库连接、释放内存等。使用defer能够确保资源在函数执行完毕时被释放,避免资源泄漏。

func readFile(filename string) ([]byte, error) {file, err := os.Open(filename)if err != nil {return nil, err}defer file.Close() // 确保在函数返回前关闭文件data, err := ioutil.ReadAll(file)if err != nil {return nil, err}return data, nil
}

在上述示例中,file.Close() 函数调用被放在了defer语句中,确保了文件在函数结束时被关闭。

错误处理

defer还可以用于错误处理,将错误处理逻辑从业务逻辑中分离出来,使代码更加清晰。通过在错误处理函数中使用defer,可以在函数返回前进行日志记录、统计等操作。

func handleError(err error) {if err != nil {fmt.Println("An error occurred:", err)}
}func main() {defer handleError(recover()) // 在panic时执行错误处理panic("Oops, something went wrong!")
}
// 输出:
// An error occurred: Oops, something went wrong!

在上述示例中,handleError 函数会在 main() 函数中的panic发生时被执行。

性能优化

defer 语句的执行开销通常很小,但是在某些性能敏感的情况下,可能需要避免过多地使用defer。可以使用defer来延迟一些高开销的操作,以便在函数返回之前进行。

defer 的注意事项

参数求值时机

defer语句中,函数的参数在defer语句执行时就会被求值。这意味着如果函数参数包含了表达式,这些表达式会在defer语句执行时被计算,而不是在函数实际执行时。⭐⭐⭐⭐

func main() {i := 0defer fmt.Println(i) // 输出 0,不是 1i++
}

避免过度使用

虽然defer语句非常强大,但是过度使用它可能会使代码变得难以理解。应当遵循适度使用的原则,将defer用于清晰化代码、资源释放和错误处理等需要的地方。❀❀❀❀❀

总结

defer 关键字是Go语言中一个强大的工具,用于延迟执行函数调用,实现资源释放、错误处理和性能优化等功能。通过将需要延迟执行的操作放在defer语句中,可以保证这些操作会在函数返回前被执行,增加代码的可靠性和可维护性。同时,defer的应用场景包括资源管理、错误处理、性能优化等多个方面,使得它在Go语言中具有广泛的用途。

在使用defer时,需要注意参数求值时机和避免过度使用的问题,以保证代码的正确性和清晰性。通过合理地使用defer,您可以编写更加优雅和高效的Go代码,为项目开发提供更大的支持。🚀🚀🚀🚀🚀

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

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

相关文章

2023年高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

手把手教你用 ANSYS workbench

ANSYS Workbench ANSYS Workbench是一款基于有限元分析(FEA)的工程仿真软件。其基本概念包括: 工作区(Workspace):工程仿真模块都在此区域内,包括几何建模、网格划分、边界条件设置、分析求解等…

Ubuntu-Server 22.04安装详细过程-图文版

一.下载Ubuntu Server镜像,官方地址下载即可 https://ubuntu.com/download/server 乌班图镜像网址,点击下载即可 二.安装乌班图镜像,最好自己准备u盘在ISO软件内制作完成 1.选择 Install Ubuntu Server 2.选择安装语言为英语 3.安装程序更新选…

C#,《小白学程序》第二课:数组与排序

1 文本格式 /// <summary> /// 《小白学程序》第二课&#xff1a;数组与排序 /// </summary> /// <param name"sender"></param> /// <param name"e"></param> private void button2_Click(object sender, EventArgs …

Vue3(开发h5适配)

在开发移动端的时候需要适配各种机型&#xff0c;有大的&#xff0c;有小的&#xff0c;我们需要一套代码&#xff0c;在不同的分辨率适应各种机型。 因此我们需要设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…

SD 总线引脚介绍

参考 https://www.cnblogs.com/justin-y-lin/p/12259851.html SD卡与TF卡的引脚定义 - 360文档中心

java+springboot+mysql医院预约挂号管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的医院预约挂号管理系统&#xff0c;系统包含超级管理员、管理员、医生、患者角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;科室管理&#xff1b;床位管理&…

Linux系统编程之文件编程常用API回顾和文件编程一般步骤

目录 1.打开文件 2.创建文件 3.写入文件 4.读取文件 5.光标定位 6.关闭文件 7.文件编程一般步骤 Linux系统提供了一些常用API如&#xff1a; 打开/创建 open/creat 读写 write /read 光标定位 Iseek 关闭 close 1.打开文件 参数说明 Pathname:要打开的文件名 (含路径&…

Python 通过traceback追溯异常信息

Python 通过traceback追溯异常信息 导入traceback包 import traceback自定义函数 def func_3():return 1 / 0def func_2():func_3()def func_1():func_2()捕捉异常 try:func_1() except Exception as e:traceback_info traceback.format_exc()print("traceback_info"…

桌面图标不显示

问题 桌面图标不显示 解决办法 鼠标 右击->选择-查看->显示桌面图标

深入探讨C存储类和存储期——Storage Duration

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

Linux CentOS安装抓包解包工具Wireshark图形化界面

1.Wireshark介绍 Wireshark 是一个开源的网络协议分析工具&#xff0c;它能够捕获和分析网络数据包&#xff0c;提供深入的网络故障排除、网络性能优化和安全审计等功能。它支持跨多个操作系统&#xff0c;包括 Windows、macOS 和 Linux。 2.Wireshark主要使用方法 捕获数据…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

el-backtop返回顶部的使用

2023.8.26今天我学习了如何使用el-backtop组件进行返回页面顶部的效果&#xff0c;效果如&#xff1a; <el-backtop class"el-backtop"style"right: 20px; bottom: 150px;"><i class"el-icon-caret-top"></i></el-backtop&…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及JDBC示例(4)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

跳跃游戏【贪心算法】

跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。在这里插入图片…

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…

MySql015——使用子查询

一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…

9.oracle中sign函数

在Oracle/PLSQL中, sign 函数返回一个数字的正负标志. 语法如下&#xff1a;sign( number ) number 要测试标志的数字. If number < 0, then sign returns -1. If number 0, then sign returns 0. If number > 0, then sign returns 1. 应用于: Oracle 8i, Oracle …

Idea配置Remote Host

一、打开RemoteHost窗口 双击shift打开全局搜索 搜索Tools→Deployment→Browse Remote Host或 idea项目顶部Tools→Deployment→Browse Remote Host 二、添加服务 右侧边栏打开RemoteHost&#xff0c;点击三个点&#xff0c;起个名字&#xff0c;选择type为SFTP&#xff…