【go从零单排】panic、recover、defer

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 语言中,panic 是一种用于处理异常情况的机制。它允许程序在遇到严重错误时停止执行,并可以在调用栈中向上抛出错误,直到被捕获或程序崩溃。

💻代码

panic

package main//导入os包
import "os"func main() {//这行代码立即引发一个panic,并打印出信息 "a problem"。程序会在这一行停止执行,不会继续执行后面的代码。panic("a problem")//后面的代码都不会执行_, err := os.Create("/tmp/file")if err != nil {panic(err)}
}//输出
//panic: a problem
//goroutine 1 [running]:
//main.main()
//        /Users/dudusman/GolandProjects/awesomeProject/post.go:8 +0x25
//exit status 2

recover

使用 recover 函数来捕获 panic,从而防止程序崩溃。
recover 只能在 defer 的函数中有效。

package mainimport ("fmt"
)func main() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from:", r)}}()fmt.Println("Starting the program...")panic("A critical error occurred!") // 触发 panicfmt.Println("This line will not be executed.")
}
//输出
//Starting the program...
//Recovered from: A critical error occurred!

defer

在 Go 语言中,defer 关键字用于确保在函数执行结束时执行某些操作,无论函数是正常返回还是因为发生错误而提前退出。defer 的主要用途包括资源清理(如关闭文件、解锁互斥锁等)和执行一些必要的收尾工作。

package mainimport ("fmt""os"
)func main() {//创建文件f := createFile("/tmp/defer.txt")//使用 defer 关键字,确保在 main 函数结束时调用 closeFile(f)。//这意味着在 main 函数退出时,文件 f 将被关闭,无论是正常退出还是因为 panicdefer closeFile(f)//调用 writeFile 函数,传入文件指针 f,在文件中写入数据writeFile(f)
}// createFile 函数接受一个字符串参数 p(文件路径),尝试创建该文件。
func createFile(p string) *os.File {fmt.Println("creating")f, err := os.Create(p)if err != nil {panic(err)}//如果成功,返回文件指针 f。return f
}func writeFile(f *os.File) {fmt.Println("writing")fmt.Fprintln(f, "data")}// closeFile 函数接受一个文件指针 f,尝试关闭文件。
func closeFile(f *os.File) {fmt.Println("closing")err := f.Close()//关闭文件时发生错误,打印错误信息到标准错误输出,并使用 os.Exit(1) 退出程序if err != nil {fmt.Fprintf(os.Stderr, "error: %v\n", err)os.Exit(1)}
}
  • defer 语句会将其后面指定的函数调用推迟到包含它的函数返回时执行

多个defer

package mainimport "fmt"func main() {defer fmt.Println("first")defer fmt.Println("second")defer fmt.Println("third")
}
//输出
//third
//second
//first

🔍理解

  • panic 通常用于表示程序运行时的不可恢复错误,例如数组越界、空指针解引用等。
  • 当调用 panic 时,程序会停止当前的执行流程,并开始逐层返回到调用栈中的上层函数。
  • 多个 defer 语句会按照后进先出(LIFO)的顺序执行。这意味着最后一个被推迟的函数会最先执行。

💡 Tips小知识点

  • defer 语句的参数在声明时就会被求值,而不是在执行时。这意味着如果在 defer 语句中使用变量,其值将在 defer 被调用时确定,而不是在函数返回时。
package mainimport "fmt"func main() {x := 10defer fmt.Println(x) // x 的值为 10x = 20
}//输出10

defer用途

  • 资源清理:如关闭文件、网络连接等。
  • 解锁互斥锁:在并发编程中,确保在使用完共享资源后释放锁。
  • 记录日志:在函数返回时记录执行情况。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Windows erver】配置高性能电源管理

操作场景 在 Windows Server 操作系统上,需要配置高性能电源管理,才能支持实例软关机,否则云服务器控制台只能通过硬关机的方式关闭实例。本文档以 Windows Server 2012 操作系统为例,介绍配置电源管理的方法。 操作说明 修改电…

十大内衣洗衣机排名:2024十大实力强大内衣洗衣机推荐

现在洗衣机已经是现代家庭的必备家电,它给我们带来了更加方便舒适的生活。但即使是有了洗衣机大家还是不会将所有的衣物都丢进大型洗衣机洗。尤其是内衣裤、袜子,很多人都是选择手洗的,觉得这样的清洁方式才能清洗干净,但其实事实…

esayExcel根据模板导出包含图片

1、效果 2、模板 3、工具类代码 /*** 根据模板填充* param response* param templateStream 模板文件流* param map 模板文件所需要的参数* param list list循环模板参数* throws IOException*/public static void templateFilling(HttpServletRequest servletRequest,HttpServ…

【Linux系统编程】第四十五弹---线程互斥:从问题到解决,深入探索互斥量的原理与实现

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程互斥 1.1、见一见多线程访问问题 1.2、解决多线程访问问题 1.2.1、互斥量的接口 1.2.2、互斥量接口的使用 1.2.3、…

【贪心算法】贪心算法三

贪心算法三 1.买卖股票的最佳时机2.买卖股票的最佳时机 II3.K 次取反后最大化的数组和4.按身高排序5.优势洗牌(田忌赛马) 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励&#…

认知战认知作战:雍正设立军机处的认知战策略分析

认知战认知作战:雍正设立军机处的认知战策略分析 认知战认知作战:雍正设立军机处的认知战策略分析 认知战认知作战:雍正设立军机处的认知战策略分析 关键词:认知作战,新质生产力,人类命运共同体,认知战,认知域,认知战研究中心,认…

AI - 人工智能;Open WebUI;Lobe Chat;Ollama

AI - 人工智能;Ollama大模型工具;Java之SpringAI(三) 鉴于使用Ollama的命令行交互不是很方便,所以我们需要另一个开源的WebUI,搭建一个能通过浏览器访问的界面;Ollama的Web & Desktop非常多…

特斯拉车速转向电量充电油门刹车档位车门座椅调节灯光信号采集

特斯拉CAN信号采集方案主要包括硬件连接、数据采集与配置、数据解析与可视化等步骤。速锐得主要采集和测试关于特斯拉车速转向电量充电油门刹车档位车门座椅调节灯光信号。 我们拆开特斯拉网关部分用于CAN总线的连接,将CANH和CANL接入到网关对应的CAN针脚&#xff0…

【LLM Agents体验 3】利用Open-WebUI+Ollama本地部署Qwen2.5:7B大模型的安装指南

Open WebUI是一种基于 Web 的用户界面,用于管理和操作各种本地和云端的人工智能模型。它提供了一个直观的图形化界面,使用户可以方便地加载、配置、运行和监控各种 AI 模型,而无需编写代码或使用命令行界面。 Open-WebUI 是一款功能强大且易于…

3.2 Fiddler基础测试

1 请求响应报文 1.1 请求部分 Headers:显示请求的头信息,重点关注请求类型。textView & SyntaxView:分别以纯文本和语法高亮的方式显示请求参数。WebForms:显示请求的 GET 参数和 POST body 内容。HexView:以十六…

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5:Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了,但是都是基于ROS的,现在最新的已经是ROS2,这里把不同的地方简单记录一下。 搭建一个简单的场景&a…

【C++】模板(一):函数模板

大家好,我是苏貝,本篇博客带大家了解C的函数模板,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1.模板2. 函数模板1 概念2 函数模板的实例化(A) 隐式实例化:让编译…

通俗易懂的介绍期权如何开户以及条件与规则!

一文带你了解通俗易懂的介绍期权如何开户以及条件与规则,一般在证券和期货开通期权账户是需要满足基本的验资门槛,而期权平台是可以在线上开通的。具体的期权开户过程可以参考以下几个步骤。 一、期权开户的条件和流程 1. 年龄要求:投资者必…

【go从零单排】Text Templates

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Go 中的文本模板(Text Templates)是通过 text/template 包…

mysql 常用命令(二)

1、创建空表 mysql> CREATE TABLE test ( id int(4) NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETlatin1;AUTO_INCREMENT:自增,下次插入数据,会自动增加ID的值,…

麦肯锡数字化转型方法论:系统性四步法

在全球范围内,众多企业纷纷投身于数字化转型,对价值链各环节产生深远影响。 数字化转型不仅能够创造价值,提高生产力,还能帮助企业保持竞争优势。 然而,大多数转型都因准备不充分而遭遇失败。 麦肯锡通过对全球上千个…

政企学习考试系统(源码+文档+部署+讲解)

本文将深入解析“政企学习考试系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 本项目名称为政企学习考试系统,是一款面向政企用户的在线学习与考试平台。该系统旨在为用户提供便捷、高效的学习和考核服务&a…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中,不仅仅需要监控TPS,响应时间,报错率等这些系统基础性能数据,还需要对服务器的性能(如CPU、磁盘、内存、网络IO等)做监控,以求对系统运行过程中的硬件性能有…

三级等保安全解决方案,实施方案,整改方案(Word,PPT等相关资料学习)

信息系统进行三级等保的主要原因在于保障信息安全,维护国家安全和公共利益。三级等保是我国根据相关法律法规制定的信息安全等级保护制度中的一部分,旨在确保信息系统的完整性、可用性和保密性。通过三级等保,信息系统可以得到一系列的安全保…