golang特性1

golang特性

defer、recover异常捕获和处理

应用场景

1. 资源释放

  • 文件操作:在打开文件后,使用 defer 关闭文件句柄,确保文件在函数退出时被关闭,避免资源泄漏。
  • 数据库连接:在打开数据库连接后,使用 defer 关闭数据库连接,确保数据库连接在函数退出时被关闭,防止数据库连接泄漏。
  • 锁释放:在加锁后,使用 defer 释放锁,确保在函数退出时锁被正确释放,避免死锁情况。

2. 异常捕获和处理

  • 错误恢复:使用 defer 和 recover 捕 panic,并进行错误处理。在程序可能发生致命错误但不想使程序终止的情况下,可以使用 recover 恢复程序的执行,进行必要的错误处理后继续执行。

  • 错误记录:在一些关键任务中,可能不想让程序崩溃,但又想记录异常情况。通过使用 defer 和 recover,可以在出现 panic
    时记录错误信息,然后程序可以继续执行。

defer

defer 是 Go 语言中的一个关键字,用于延迟执行函数调用。被延迟执行的函数会在包含 defer 语句的函数返回之前执行,无论函数是正常返回还是发生了 panic。这使得 defer 可以用于一些清理操作,例如关闭文件、释放资源等。

  • defer 关键词用来声明一个延迟调用函数,该函数可以是匿名函数也可以是具名函数
  • defer延迟函数执行时间(位置),方法return之后,返回参数到调用方法之前
  • defer 延迟函数可以在方法返回之后改变函数的返回值在方法结束(正常返回,异常结束)都会去调用
  • defer声明的延迟函数,可以有效避免因异常导致的资源无法释放的问题 可以指定多个 defer延迟函数,多个延时函数执行顺序为后进先出
  • defer 通常用于资源释放、异常捕获等场景,例如:关闭连接,关闭文件等
  • defer 与recover 配合可以实现异常捕获与处理逻辑
  • 不建议在for循环中使用defer
package mainimport "fmt"func main() {for i := 0; i < 3; i++ {defer fmt.Println("Deferred call in loop:", i)}fmt.Println("Loop ended")
}
Loop ended
Deferred call in loop: 2
Deferred call in loop: 1
Deferred call in loop: 0

defer 语句在循环结束后才执行,而且执行顺序是后进先出的。所以在循环中使用 defer 时要谨慎,确保不会导致不必要的资源浪费或不正确的行为。

defer 的典型用途包括:

关闭文件或数据库连接等资源释放
在函数返回之前记录日志信息
在发生异常时执行清理操作
在函数调用前后进行计时或性能分析等操作

recover

recover 是一个内建函数,用于从 panic 中恢复,并返回导致 panic 的值。它通常与 defer 语句一起使用,在发生 panic 时捕获异常,然后进行必要的处理。

  • Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来
  • recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果
  • 如果当前的 goroutine 出现panic,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行
package mainimport "fmt"func recoverDemo() {if r := recover(); r != nil {fmt.Println("Recovered:", r)}
}func causePanic() {defer recoverDemo() // 在panic发生后执行recoverDemo函数fmt.Println("Start panic")panic("panic occurred")fmt.Println("End panic") // 这行代码不会被执行
}func main() {causePanic()fmt.Println("Program continues") // 虽然有panic,但由于recover已经处理了,所以程序继续执行
}

输出结果

Start panic
Recovered: panic occurred
Program continues

当 causePanic 函数调用 panic 时,程序会发生 panic,但是由于 recoverDemo 函数被 defer 延迟调用,它在 panic 发生后被执行,打印出了 panic 的信息。然后程序继续执行,而不会终止。

panic

panic 是一个内建函数,用于表示程序遇到了一些无法处理的错误或不可恢复的情况,导致程序的执行无法继续下去。当程序遇到 panic 时,它会立即停止当前函数的执行,沿着函数调用栈向上一层层地执行延迟函数(即使用 defer 声明的函数),然后程序终止并打印出 panic 的信息。

  • Go语言的一种异常机制
  • 可通过panic 函数主动抛出异常
  • 发生时停止函数执行:panic 会导致当前函数的执行立即停止,并开始执行 defer 声明的延迟函数。
  • 传播至调用栈:如果当前函数无法处理 panic,它会向调用当前函数的函数传播 panic,直到遇到可以处理 panic 的 recover,或者直到达到最外层的函数,此时程序会终止并打印出 panic 的信息。
  • 通常用于表示致命错误:panic 通常用于表示程序遇到了一些无法恢复的致命错误,例如无效的参数、内存溢出、文件不存在等。
package mainimport "fmt"func main() {fmt.Println("Start of main")panic("Something went wrong!") // 程序会在这里发生panicfmt.Println("End of main") // 这行代码不会被执行
}

当 panic 被调用时,程序会立即停止执行 main 函数,并开始执行 defer 声明的延迟函数(如果有的话),然后打印出 panic 的信息并终止程序。

虽然 panic 可以用于表示程序的错误状态,但通常建议只在遇到无法处理的情况下才使用 panic,而在可以预见和处理的错误情况下使用错误类型进行错误处理。

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

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

相关文章

JS小项目-计算器

需求&#xff1a;根据素材制作如图所示页面&#xff0c;在页面输入第一个数和第二个数&#xff0c;单击&#xff08;加&#xff09;、&#xff0d;&#xff08;减&#xff09;、&#xff0a;&#xff08;乘&#xff09;、&#xff0f;&#xff08;除&#xff09;按钮时&#xf…

Your file appears not to be a valid OLE2 document

前言 org.apache.poi.poifs.filesystem.NotOLE2FileException:Invalid header signature; read 0x0000000000000000, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document解决 Excel兼容模式打开老版本文件造成文件损坏&#xff0c;大多说的是点…

vscode-tasks.json自定义任务

以下所有内容,参考自VScode官方文档: vscode_tasks-docs任务说明文档vscode_variables-reference-docs变量说明文档vscode addtional docs for tasksvscode launch.json 属性设置文档,(下文没有介绍,没有涉及) 浅浅记录一下个人对vscode任务(task)的理解,还谈不上使用. 文章目…

linux通配符

通配符&#xff0c;它是一种用于匹配文件名的特殊字符。通配符在Linux中可以帮助我们更加方便和快捷地查找和操作文件。

IDEA new ui 找不到evaluate

问题 idea升级新版本之后&#xff0c;发现熟悉的evaluate不见了&#xff0c;只能通过快捷键启动&#xff0c;未免太麻烦了&#xff0c;如何像旧版一样添加图标直接点呢&#xff1f; 解决方案 打开debug窗口&#xff0c;在这个地方右键&#xff0c;然后选择add actions 搜索…

Mysql底层原理四:B+树索引

B树索引&#xff08;索引的原理&#xff09; 1.前言 前边我们详细唠叨了InnoDB数据⻚的7个组成部分&#xff0c;知道了各个数据⻚可以组成⼀个双向链表&#xff0c;⽽每个数据⻚中的记录会按照主键值从⼩到⼤的顺序组成⼀个单向链 表&#xff0c;每个数据⻚都会为存储在它⾥边…

【Web】纯萌新的CISCN刷题记录(1)

目录 [CISCN 2019华东南]Web11 [CISCN 2019华北Day2]Web1 [CISCN 2019初赛]Love Math [CISCN 2022 初赛]ezpop [CISCN 2019华东南]Double Secret [CISCN 2023 华北]ez_date [CISCN 2019华北Day1]Web1 [CISCN 2019华东南]Web4 [CISCN 2019华北Day1]Web2 [CISCN 2023 …

解决电脑无故自动关机或重启的15种方法,总有一种适合你

序言 你的Windows PC是否在没有警告的情况下关闭或重新启动?这背后有几个潜在的原因。例如,它可能是软件/硬件冲突、过热或硬盘驱动器错误。本故障排除指南将概述在Windows 10/11中修复自动关闭和重新启动的多个解决方案。 如果你的计算机经常关闭,则必须在安全模式下启动…

SSH免密登录 远程创建账户

初级代码游戏的专栏介绍与文章目录-CSDN博客 SSH免密登录是个很方便的功能&#xff0c;让你可以在一个节点上操作所有主机而不用输入用户名密码。当然这也是个安全隐患&#xff0c;操作节点密码泄露等于所有主机密码泄露。有利有弊&#xff0c;斟酌选择。 目录 一、原理 二、…

JMeter 常见函数讲解

当使用JMeter进行性能测试或负载测试时&#xff0c;函数是一个非常有用的工具&#xff0c;可以帮助生成动态的测试数据或处理测试结果。 下面是一些常用的JMeter函数的详细讲解和并列示例&#xff1a; 1、__threadNum&#xff1a; 返回当前线程的编号。可以在测试过程中用于…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

C++学习笔记九--模版

目录 前言 1.函数模版 1.函数模版的概念和定义 2.函数模版的实例化 2.类模版 1.类模版的概念和定义 2.类模版的实例化 3.示例代码 前言 这篇文章介绍下C中的模版&#xff0c;包括函数模版和类模版。 1.函数模版 在编程的过程中&#xff0c;编写函数都会考虑将其写成模版…

静态中间继电器 HJZ-J908 AC380V 导轨安装 JOSEF约瑟

系列型号&#xff1a; HJZ-J902静态中间继电器&#xff1b;HJZ-J905静态中间继电器&#xff1b; HJZ-J907静态中间继电器&#xff1b;HJZ-J907L静态中间继电器&#xff1b; HJZ-J908静态中间继电器&#xff1b;HJZ-J909静态中间继电器&#xff1b; HJZ-J910静态中间继电器&…

SpringCloud学习(12)-SpringCloudAlibaba-Sentinel

Sentinel介绍 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 官网 home | Sentinel 下载…

如何查看当前swap 在哪个文件,linux swap 分区被占满了,如何手动处理

查看当前swap 查看当前swap在哪个文件&#xff0c;可以使用以下命令&#xff1a; cat /proc/swaps 输出结果中&#xff0c;Filename列显示了当前swap文件的文件名。 例如&#xff0c;输出结果如下&#xff1a; cat /proc/swapsFilename Type Size Used Priority /swa…

python应用-计算两个日期的时间差

学习目录 1. 安装deteutil包 2. 导入relativedelta类 3. 计算两个日期的差值 4. 计算1个日期和时间差相加后得到新的日期 之前在工作中遇到一个使用场景&#xff1a;需要计算两个日期之前的差值&#xff0c;比如相差了几年几月几日&#xff0c;查找资料发现deteutil包的rel…

vue3中封装table表格

封装实例useTable import {ref } from vue export function useTable(api) {const data = ref([])const refre

从用友U9到钉钉通过接口配置打通数据

从用友U9到钉钉通过接口配置打通数据 接通系统&#xff1a;用友U9 用友U9cloud深耕制造领域十三载&#xff0c;U9cloud在机械、电子、汽配、家具、整车、军工等细分行业有着深厚的积累&#xff0c;尤其是机械、电子和汽配行业&#xff0c;不但打造了多个成熟的产品模式和应用场…

【频繁模式挖掘】FP-Tree算法(附Python实现)

一、实验内容简介 该实验主要使用频繁模式和关联规则进行数据挖掘&#xff0c;在已经使用过Apriori算法挖掘频繁模式后&#xff0c;这次使用FP-tree算法来编写和设计程序&#xff0c;依然使用不同规模的数据集来检验效果&#xff0c;最后分析和探讨实验结果&#xff0c;看其是…

计算机视觉入门教程

计算机视觉是一门涉及多个学科的综合性技术领域&#xff0c;它主要研究如何使计算机能够“看到”并理解图像或视频中的信息。对于初学者来说&#xff0c;入门计算机视觉需要掌握一系列的基础知识和技能。以下是基于搜索结果提供的计算机视觉入门教程的详细指南。 1. 计算机视觉…