Go进阶概览 -【7.3 Go语言中的安全与错误处理】

7.3 Go语言中的安全与错误处理

Go语言的错误处理机制以简洁和健壮著称,为我们提供了一套简单但灵活的工具来应对不同场景下的错误处理。

本章将深入探讨Go的错误处理模式,包括panic/recover机制以及如何编写健壮、容错的代码。

本节代码存放目录为 lesson21

错误处理的基本模式

Go语言中,常见的错误处理模式是通过返回值来处理的。标准库中的许多函数都会返回一个error类型作为其返回值之一。

我们可以根据error的值判断是否发生了错误:

func doSomething() error {_, err := strconv.ParseInt("1.2x", 10, 64)if err != nil {return fmt.Errorf("parse failed: %w", err)}return nil
}func main() {err := doSomething()if err != nil {fmt.Println("Error occurred:", err)} else {fmt.Println("Success")}
}

error类型

Go语言中,error是一个接口类型,它只有一个方法Error()

通过实现这个接口,可以定义自定义的错误类型:

type MyError struct {Msg string
}func (e *MyError) Error() string {return e.Msg
}func doSomething1() error {return &MyError{Msg: "Something went wrong"}
}

通过自定义错误类型,我们可以携带更多上下文信息,增强错误的可追踪性。

panic/recover机制

panic机制

在某些极端情况下,Go语言支持通过panic中断正常的控制流程。

panic通常用于无法恢复的错误,或在程序发生不可预料的严重错误时中断执行。

func mightPanic() {panic("unexpected situation")
}func main() {fmt.Println("Starting")mightPanic()fmt.Println("This will not run")
}

一旦触发panicGo的运行时会开始逐层向上传播,直到找到合适的recover或终止整个程序。

recover机制

为了防止程序因为panic而崩溃,Go语言提供了recover机制,允许开发者捕获并恢复panic,从而使程序继续执行。通常,recover会在defer函数中使用。

func mightPanic() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)}}()panic("unexpected situation")
}

在上面的代码中,recover捕获了panic,使得程序在处理完错误后继续执行。

错误处理的最佳实践

避免过度使用panic

panic应该仅用于无法恢复的严重错误场景。对于普通的错误处理,应该首选通过error类型返回错误。

使用defer确保资源释放

deferGo语言中一个重要的功能,通常用于在函数结束时进行清理操作。

通过defer可以确保在函数发生panic或正常退出时,关键资源得到正确释放。

func fileOperation() error {f, err := os.Open("example.txt")if err != nil {fmt.Println(err)return nil}defer f.Close()// 文件操作...return nil
}
包装错误

在处理错误时,尤其是在传播错误的过程中,为了保持错误信息的完整性和上下文,可以使用fmt.Errorf包装错误。

func doSomething() error {return fmt.Errorf("something failed: %w", err)
}

通过这种方式,可以保留最初的错误原因,并在必要时解包错误。

使用errors.Iserrors.As

Go 1.13之后,errors.Iserrors.As函数被引入,用于更灵活的错误检查。

  • errors.Is用于判断一个错误是否与特定错误匹配(即使经过了包装)。

  • errors.As用于判断错误是否是特定类型,并进行类型转换。

if errors.Is(err, strconv.ErrSyntax) {fmt.Println("number ErrSyntax")
}var (myErr *MyError
)
if errors.As(err, &myErr) {fmt.Println("Caught MyError:", myErr.Msg)
}

小结

Go语言的错误处理机制鼓励开发者编写健壮的、容错的代码。

通过合理使用error类型、panic/recover机制,以及遵循最佳实践,我们可以有效地处理程序中的各种错误场景。

关于本节总结如下:

  • 使用error作为首选错误处理机制

  • panic/recover仅适用于无法恢复的错误或异常

  • 通过deferrecover确保程序的健壮性和资源的正确释放


我的GitHub:https://github.com/swxctx

书籍地址:https://d.golang.website/

书籍代码:https://github.com/YouCanGolang/GoDeeperCode

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

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

相关文章

【CSS】字体文本

color 颜色font-size 大小font-family 字体font-style 样式font-weight 加粗text-decoration 下划线text-shadow 阴影text-transform 大小写变换text-indent 缩进text-align 水平对齐 、vertical-align垂直对齐text-overflow 溢出word-wrap 换行word-break 截断white-space 空白…

最新绿豆影视系统 /反编译版源码/PC+WAP+APP端 /附搭建教程+软件

源码简介: 最新的绿豆影视系统5.1.8,这可是个反编译版的源码哦!它不仅支持PC端、WAP端,还有APP端,一应俱全。而且附上了搭建教程和软件,安卓和苹果双端都能用,实用方便! 优化内容&…

力扣647-回文子串(Java详细题解)

题目链接:力扣647-回文子串 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个d…

软考高级:中台相关知识 AI 解读

中台(Middle Platform)是近年来在软件开发和企业架构中兴起的一种理念和架构模式,尤其在中国的互联网企业中得到了广泛应用。中台的核心思想是通过构建一个共享的服务和能力平台,支持前端业务的快速迭代和创新,从而提升…

【学习笔记】TLS/SSL握手之Records

TLS / SSL会话是由记录(Records)所组成,有4种records HandshakeAlertChange Cipher SpecApplication DataHandshake和Alert Records被分为子类型(Subtypes): Handshake:Client HelloHandshake&a…

塑料瓶回收标志分级检测系统源码分享

塑料瓶回收标志分级检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…

QT编译之后的debug包下运行程序双击运行出现无法定位程序输入点__gxx_personlity_seh0于动态链接库

1.出现这个错误的原因是: 缺少如下文件: 2.解决方法: 在运行程序.exe所在的目录执行:windeployqt untitled.exe(指打包的运行程序) 3.如果执行提示由于找不到qt5core.dll,无法继续执行代码和无法识别win…

第十一章 从0-1搭建一个简单的JavaWeb系统(三)

目录 一、工程代码结构 二、代码实现 三、运行效果 四、未完待续 本章节的每一段代码,建议全部自己敲一遍,加深印象,切勿直接复制黏贴。 一、工程代码结构 本章节实现注销(退出)功能,以下图片中标红的…

无线感知会议系列【4】【基于WiFi和4G/5G的非接触无线感知:挑战、理论和应用-2】

前言: 本篇重点分享一下该论文 《Human Respiration Detection with Commodity Wifi Devices: Do User Location and Body Orientation Matter》 接 2020年北京智源大会 张大庆老师的一个报告 参考: https://blog.csdn.net/chengxf2/article/detai…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十集:制作后坐力系统Recoil和小骑士的生命系统和受伤系统

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作后坐力系统Recoil 1.使用代码实现扩展新的后坐力行为2.为敌人脚本添加后坐力行为3.为小骑士添加后坐力行为二、制作小骑士的生命系统和受伤系统 1.制作…

sqlserver 合并重复行数据,取有值的字段

我有这样的一个需求,先看数据 上面的记录,圈起来的 数据关键字段是重复的,但有的字段不一样, 我现在想合并为一条,特殊字段,取有值的 搜了很多行转列,都不是我需要的 不过有了启发&#xff0…

【自动驾驶】基于车辆几何模型的横向控制算法 | Pure Pursuit 纯跟踪算法详解与编程实现

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

一文学会 Java 8 的Predicates

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 在这份详细的指南中,您将了解 Java Predicates,这是 Java 8 中一个新颖且有用的特性。本文解释了 Java Predicates 是什么以及如何在各种情况下使用它们。 在这份详尽的指南中…

JVM 几种经典的垃圾收集器

目录 前言 Serial Serial Old ParNew Parallel Scavenge Parallel Old CMS收集器 garbage first 收集器 前言 回顾一下之前的几种垃圾收集算法: JVM java主流的追踪式垃圾收集器-CSDN博客文章浏览阅读646次,点赞22次,收藏16次。简要介绍了几…

AI大模型教程 Prompt提示词工程 AI原生应用开发零基础入门到实战【2024超细超全,建议收藏】

在AGI(通用人工智能)时代,那些既精通AI技术、又具备编程能力和业务洞察力的复合型人才将成为最宝贵的资源。为此,我们提出了‘AI全栈工程师’这一概念,旨在更精准地描述这一复合型人才群体,而非过分夸大其词…

RocketMQ消费者消费的时候,宕机了,消息会丢失吗?

一个消息从生产者产生,到被消费者消费,主要经过这3个过程: 因此,本文将从以下这几个维度来回答: 生产者如何保证不丢消息 存储端如何保证不丢消息 消费者如何保证不丢消息 最后消费者消费的时候,宕机,消息会不会丢呢? 1. 生产者如何保证…

SaaS 软件转型计划

目录 一、转型目标 1、背景与趋势分析 2、转型策略与实施路径 3、预期成果与展望 二、现状分析 1、产品评估:从传统到SaaS的华丽转身 2、客户群体洞察:倾听需求,引领变革 3、销售渠道优化:拓宽路径,触达更多客…

如何高效绘制ER图?

在数据驱动的时代,实体-关系图(ER图)作为数据建模的核心工具,对于理解、设计和优化数据库结构至关重要。然而,传统的手绘或复杂软件绘制ER图方式往往效率低下且难以协作。幸运的是,ProcessOn在线绘图工具以…

潮玩宇宙大逃杀宝石游戏搭建开发

潮玩宇宙大逃杀的开发主要涉及以下方面: 1. 游戏概念和设计: 核心概念定义:确定以潮玩为主题的宇宙背景、游戏的基本规则和目标。例如,玩家在宇宙场景中参与大逃杀竞技,目标是成为最后存活的玩家。 玩法模式设计&a…