15分钟学 Go 第 20 天:Go的错误处理
第20天:Go的错误处理
目标
学习如何处理错误,以确保Go程序的健壮性和可维护性。
1. 错误处理的重要性
在开发中,错误处理至关重要。程序在运行时可能会出现各种问题,例如文件未找到、网络连接失败等。正确的错误处理能帮助我们及时发现问题,提供优雅的错误处理机制,确保软件的可靠性和用户体验。
2. Go语言中的错误类型
在Go语言中,错误处理主要依赖于error类型。error是一个内置接口,其定义如下:
type error interface {Error() string
}
任何实现了Error方法的类型都可以被视为错误,例如标准库中的os和io包中的错误类型。
错误处理的基本步骤
- 检查错误:在调用可能返回错误的函数后,要立即检查返回的错误。
- 处理错误:根据业务需求,决定如何处理错误。
- 返回错误:在函数中,适当地返回错误给调用方。
错误处理的规范
Go语言提倡便捷而显式的错误处理方式。例如,在调用函数时立即处理错误,而不是使用异常机制。
3. 错误处理的示例
下面是一个简单的文件读取示例,演示如何处理错误。
示例代码
package mainimport ("fmt""io/ioutil""log"
)func readFromFile(filePath string) (string, error) {data, err := ioutil.ReadFile(filePath)if err != nil {return "", err // 返回错误}return string(data), nil
}func main() {filePath := "example.txt"content, err := readFromFile(filePath)if err != nil {log.Fatalf("Error reading file: %v", err) // 处理错误并退出程序}fmt.Println("File content:", content)
}
运行流程图
以下是示例代码的运行流程图:
+----------------------------+
| main()函数 |
+----------------------------+|v+---------------------+| 调用readFromFile() |+---------------------+|v+-------------------------+| 调用ioutil.ReadFile() |+-------------------------+|v+-------------------+| 返回错误 |+-------------------+|v+-------------------+| 判断错误是否为 nil |+-------------------+|v(是) -> +--------------+ | 打印内容 | (否) ---> +--------------+| 处理错误 |+--------------+
代码运行流程详解
main函数中定义了文件路径filePath。- 调用
readFromFile函数读取文件。 - 在
readFromFile中,使用ioutil.ReadFile尝试读取文件内容。 - 如果读取失败,则返回错误。
- 在
main中检查错误。如果存在错误,则使用log.Fatalf打印错误并退出程序。 - 如果没有错误,输出文件内容。
4. 自定义错误类型
除了使用内置的error接口外,有时我们需要定义自定义错误,以便提供更具体的错误信息。
自定义错误的示例
package mainimport ("fmt"
)// Custom error type
type FileError struct {Filename stringErr error
}// 实现Error方法
func (e *FileError) Error() string {return fmt.Sprintf("Error reading file %s: %v", e.Filename, e.Err)
}func readFromFile(filePath string) (string, error) {data, err := ioutil.ReadFile(filePath)if err != nil {return "", &FileError{Filename: filePath, Err: err} // 包装错误}return string(data), nil
}func main() {filePath := "example.txt"content, err := readFromFile(filePath)if err != nil {fmt.Println(err) // 打印自定义错误return}fmt.Println("File content:", content)
}
关键点
- 通过定义结构体
FileError和实现Error方法,实现了自定义错误类型。 - 将错误包装在
FileError中,使得错误信息更具可读性。
5. 包装和解包错误
Go 1.13引入了errors包中的Is和As函数,这使得错误处理更加灵活和强大。
错误包装的示例
使用fmt.Errorf和errors.Unwrap:
package mainimport ("errors""fmt"
)func main() {err := errors.New("original error")wrappedErr := fmt.Errorf("wrapped error: %w", err) // 使用%w进行错误包装// 解包错误if errors.Is(wrappedErr, err) {fmt.Println("The wrapped error contains the original error")}
}
错误解包的优点
- 便于判断错误类型。
- 可以在不同的层级中恢复到原始错误,使错误跟踪更加清晰。
6. 错误处理的最佳实践
- 尽早检测错误:在可能发生错误的地方提前检查并处理,而不是延迟处理。
- 记录错误日志:使用适当的日志机制记录错误信息,以便日后分析和修复。
- 提供用户友好的错误信息:将错误信息格式化,使其对最终用户友好。
- 保持简洁明了:避免过度复杂的错误处理逻辑。
7. 最后总结
在Go语言中,错误处理是一个核心概念,通过error接口、中自定义错误和错误包装等机制,Go为我们提供了一种简洁高效的方式来处理错误。掌握这些技巧对于编写健壮的Go程序至关重要。
学习小结
- 理解Go语言的错误处理机制及其重要性。
- 学会使用内置的错误类型和自定义错误类型。
- 熟悉错误的包装和解包方法。
- 掌握最佳实践,为编写高质量Go代码打下基础。
练习
- 创建一个自己的错误类型,模拟文件不存在时的错误处理。
- 尝试使用
errors.Is和errors.As进行错误解包和判断。 - 设计一个小程序,读取用户输入内容,并在读取失败时提供友好的错误信息。
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!
相关文章:
15分钟学 Go 第 20 天:Go的错误处理
第20天:Go的错误处理 目标 学习如何处理错误,以确保Go程序的健壮性和可维护性。 1. 错误处理的重要性 在开发中,错误处理至关重要。程序在运行时可能会出现各种问题,例如文件未找到、网络连接失败等。正确的错误处理能帮助我们…...
C++——string的模拟实现(上)
目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…...
JavaCV 之均值滤波:图像降噪与模糊的权衡之道
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
桥接模式,外界与主机通,与虚拟机不通
一 二 在此选择Windows与外界连接的网卡,通过有线连就选有线网卡,通过无线连就选无线网卡。 三 如果需要设置固定IP,则选择"Manual"进行设置。我这边根据实际需要,走无线的时候用DHCP,走有线的时候设固定IP…...
用HTML构建酷炫的文件上传下载界面
1. 基础HTML结构 首先,我们构建一个基本的HTML结构,包括一个表单用于文件上传,以及一个列表用于展示已上传文件: HTML <!DOCTYPE html> <html> <head><title>酷炫文件上传下载</title><link …...
Gateway 统一网关
一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问,但有些业务不是对外公开的,这就需要用网关来统一替我们筛选请求,它就像是房间的一道门,想进入房间就必须经过门。而请求想要访问微服务,就必须…...
7 种常见的前端攻击
大家都知道,保证网站的安全是十分重要的,一旦网站被攻陷,就有可能造成用户的经济损失,隐私泄露,网站功能被破坏,或者是传播恶意病毒等重大危害。所以下面我们就来讲讲7 种常见的前端攻击。 1. 跨站脚本 (X…...
element plus实现点击上传于链接上传并且回显到upload组件中
摘要: 今天遇到一个问题:vue3使用elemnt plus的上传图片时,数据是从别人的系统导出来的商品,图片是http的形式的,并且商品很多的,一个一个下载下来再上传很麻烦的,所以本系统插件商品时图片使用…...
ELK日志分析系统部署
ELK日志分析系统 ELK指的是ElasticsearchLogstashKibana这种架构的缩写。 ELK是一种日志分析平台,在很早之前我们经常使用Shell三剑客(一般泛指grep、sed、awk)来进行日志分析,这种方式虽然也可以应对多种场景,但是当…...
驾校小程序:一站式学车解决方案的设计与实践
一、引言 随着移动互联网技术的飞速发展,人们的生活方式和消费习惯正在发生深刻变化。驾校作为传统的服务行业,也面临着数字化转型的迫切需求。驾校小程序作为一种轻量级的应用,能够为用户提供便捷、丰富的学车服务,成…...
【自然语言处理】BERT模型
BERT:Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理(NLP)模型,它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能,如问答系…...
Android 添加如下飞行模式(飞行模式开和关、飞行模式开关菜单显示隐藏)接口
请添加如下飞行模式(飞行模式开关、飞行模式开关显示隐藏)接口: 飞行模式飞行模式开关com.action.airplankey: enable value:boolean true open the airplan false close the airplan关闭Intent intent = new Intent(); intent.setAction("com.action.airplan");…...
【Vue3】基于 Vue3 + ECharts 实现北京市区域地图可视化
文章目录 基于 Vue3 ECharts 实现北京市区域地图可视化1、引言2、项目初始化2.1、环境搭建2.2 、安装依赖2.3、项目结构 3、地图数据准备3.1、地图 JSON 文件获取(具体的json数据) 4、 组件开发4.1、Map 组件的设计思路4.2、基础结构实现4.3、核心数据结…...
【IC】什么是min period check
在 Synopsys Primetime 工具中可以检查.lib 文件中时钟输入的最小周期。想象这样一个场景,有一个设计 A,它有一个名为 clk 的时钟,并且该设计的 clk 周期被设定为一个值,比如 2 纳秒,即 500MHz。假设我们在进行静态时序…...
MyBatis入门之一对多关联关系(示例)
【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要 书评 试读】- 京东图书 …...
【Git 】Windows 系统下 Git 文件名大小写不敏感
背景 在 Windows 系统上,Git 对文件名大小写的不敏感性问题确实存在。由于 Windows 文件系统(如 NTFS )在默认情况下不区分文件名大小写所导致的。 原因分析 文件系统差异 Windows文件系统(如 NTFS)默认不区分文件名…...
【算法系列-二叉树】层序遍历
【算法系列-二叉树】层序遍历 文章目录 【算法系列-二叉树】层序遍历1. 算法分析🛸2. 相似题型🎯2.1 二叉树的层序遍历II(LeetCode 107)2.2 二叉树的右视图(LeetCode 199)2.3 二叉树的层平均值(LeetCode 637)2.4 N叉树的层序遍历(LeetCode 429)2.5 在每个…...
我的世界方块改进版
引子 之前文章的磁性方块,通过3D打印实现,也批量打印了一些,下图就是一个小树 使用过程中,发现磁力感觉不紧,所以想改进一版。 正文 之前的结构如下:: 如果出现相邻的空隙间的磁铁相互作用&am…...
博客搭建之路:hexo增加搜索功能
文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客,没有搜索功能,如何在大批文章中找到自己想要的,那在hexo中如何增加搜索功能呢? search:path: sea…...
2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)
前言 春招,秋招,社招,我们 Java 程序员的面试之路,是挺难的,过了 HR,还得被技术面,在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
