7.2 Go 使用error类型


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 理解 Error 类型
      • 错误处理的最佳实践
        • 检查错误
        • 错误变量命名
        • 错误日志记录
        • 错误传播
        • 使用内置的错误函数
        • 错误封装
      • 错误类型断言
      • 错误链
      • 错误包装
      • 错误处理模式
        • 检查-然后-执行模式
        • 函数返回模式
        • 错误聚合
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在 Go 语言中,错误处理是程序开发中不可或缺的一部分。Go 语言通过其独特的 error 类型,提供了一种简洁而强大的错误处理机制。

理解 Error 类型

Go 中的 error 是一个内置的接口类型,它定义了一个名为 Error() 的方法,该方法返回一个描述错误的字符串。Go 标准库中的许多函数都会返回一个 error 值,如果函数执行成功,error 值为 nil;如果发生错误,则 error 值不为 nil

type error interface {Error() string
}

错误处理的最佳实践

检查错误

在 Go 中,处理错误的第一个原则是:总是检查错误。任何可能返回错误的方法调用后,都应该立即检查错误值是否为 nil

f, err := os.Open("filename.txt")
if err != nil {log.Fatal(err)
}

错误变量命名

在函数中,通常将错误变量命名为 err。这是一个约定俗成的命名方式,有助于代码的可读性。

错误日志记录

在检查错误后,记录错误信息是一个好的实践。可以使用标准库中的 log 包来记录错误。

if err := someFunction(); err != nil {log.Printf("error: %v", err)
}

错误传播

在 Go 中,函数通常通过返回值来传播错误。调用者需要检查返回的错误并相应地处理。

func someFunction() error {// ... some code ...return errors.New("some error occurred")
}func main() {if err := someFunction(); err != nil {log.Fatal(err)}
}

使用内置的错误函数

Go 的 errors 包提供了一些内置函数,如 NewAs,它们可以帮助创建和转换错误。

err := errors.New("custom error message")

错误封装

在某些情况下,你可能需要封装一个错误,以便提供更多的上下文信息。这可以通过实现自定义错误类型来实现。

type customError struct {msg string
}func (e *customError) Error() string {return e.msg
}func newCustomError(msg string) error {return &customError{msg: msg}
}

错误类型断言

在处理错误时,有时需要对错误类型进行断言,以获取更多信息或进行特定的错误处理。

var err error = someFunction()if err, ok := err.(*MyCustomError); ok {// handle custom error
}

错误链

在复杂的函数调用链中,错误可能会从一个函数传递到另一个函数。使用 fmt.Errorf 可以创建一个新的错误,并包含原始错误作为原因。

err := fmt.Errorf("failed to do something: %w", originalError)

错误包装

错误包装是创建具有额外上下文信息的新错误的一种方式。pkg/errors 包提供了一个 Wrap 函数,它允许你添加更多的上下文信息。

err := pkgerrors.Wrap(originalError, "additional context")

错误处理模式

检查-然后-执行模式

这是最基本的错误处理模式,首先检查错误,然后执行操作。

if err := checkSomething(); err != nil {return err
}
doSomething()

函数返回模式

在这种模式中,函数返回一个错误,调用者负责处理错误。

func doSomething() error {// ... do something ...return nil
}if err := doSomething(); err != nil {// handle error
}

错误聚合

当一个函数需要执行多个可能失败的操作时,可以使用 multierror 包来聚合错误。

var result error = multierror.Append(err1, err2)

总结

Go 的 error 类型提供了一种简单而强大的错误处理机制。通过遵循最佳实践,使用内置的错误函数,封装和断言错误类型,以及采用适当的错误处理模式,开发者可以编写出更加健壮和易于维护的代码。记住,错误处理不仅仅是代码的一部分,它也是程序设计哲学的一部分,需要被认真对待。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

最大数位置c++

题目描述 输入n个整数,存放在数组a[1]至a[n]中,输出最大数所在位置(n≤1000)。 输入 第一行,数的个数n; 第二行,n个正整数,每个数在232−1之内。 输出 最大数所在位置。 样例输入 5 67 43 90 78 32 样例输出 3 代码如下…

数论1---整除

概念与基本性质就不说了 例题1:已知a|n,b|n.且axby1,求证:ab|n 即: 所以:ab|n 例题2:设m是一个大于2的正整数,证明:对于任意正整数n,都有 由于我不想打公式了直接拍照…

「前端+鸿蒙」核心技术HTML5+CSS3(七)

1、浮动简介、元素浮动后的特点、浮动后的影响、解决浮动产生的影响、浮动布局 浮动简介: 浮动(Float)是CSS中一种布局机制,它允许元素脱离常规的文档流,沿其容器的左侧或右侧排列。浮动元素仍然保留在页面布局中,可能会影响其他元素的布局。 元素浮动后的特点: 元素会…

react-native 默认停用 flipper 通知

react-native 0.74 默认停用 flipper ,但仍然可以手动安装 flipper 官方声明文档 英语好的可以直接阅读。 integration with React Native will no longer be enabled 原因 增加编译时间有时候会有连接问题升级会导致不能使用 之后调试推荐 我们建议团队使用 A…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点:窗口坐标体系的原点位于窗口的左上角,即坐标(0, 0)位置。 轴方向: X轴:向右为正方向,随着X坐标值的增加,元素在窗口中从…

opencv-python(二)

马赛克 img cv2.imread(./bao.jpeg)print(img.shape)img2 cv2.resize(img,(35,23))img3 cv2.resize(img2,(900,666))cv2.imshow(bao,img3)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.resize(img, (90,66))img3 np.repeat(img2, 10, axis 0) # 重复行img4 np.repeat(…

使用Bash脚本确保定时任务的单例执行

简介: 在Linux系统中,定时任务是自动化运维的重要组成部分。然而,有时候我们可能需要确保某个定时任务在任何给定时间点只运行一次,以避免资源冲突或数据不一致。本文将介绍如何使用Bash脚本和文件锁来实现单例定时任务。 什么是…

数据结构---时间复杂度与空间复杂度

文章目录 1. 知识背景2. 什么是时间复杂度?3. 空间复杂度4 .大O渐进表示法:对于一些算法的时间复杂度存在最好,最坏,平均的情况: 5. 常见的时间复杂度举例总结:6. 空间复杂度的举例与总结:总结&…

腾讯 InstantMesh,单图生成 3D 模型,10 秒内完成,性能超越 SOTA

前言 近年来,3D 内容创作在游戏、动画、虚拟现实等领域发挥着越来越重要的作用。然而,传统的 3D 模型制作流程繁琐,需要专业人员花费大量时间和精力。为了简化 3D 内容创作流程,腾讯 ARC 实验室推出了 InstantMesh,一…

开源代码分享(32)-基于改进多目标灰狼算法的冷热电联供型微电网运行优化

参考文献: [1]戚艳,尚学军,聂靖宇,等.基于改进多目标灰狼算法的冷热电联供型微电网运行优化[J].电测与仪表,2022,59(06):12-1952.DOI:10.19753/j.issn1001-1390.2022.06.002. 1.问题背景 针对冷热电联供型微电网运行调度的优化问题,为实现节能减排的目…

prometheus-alert使用

说明:本文介绍一款可接管alertmanager报警,简化alertmanager配置的组件prometheus-alert。可以将prometheus检测到的异常指标,通过alertmanager转给prometheus-alert,由prometheus-alert通知到各个应用。 如下: 上图来…

# linux 系统下,使用 docker 启动 mysql 后,通过 sqlyog 连接 mysql 报“错误号码2058“

linux 系统下,使用 docker 启动 mysql 后,通过 sqlyog 连接 mysql 报“错误号码2058“ 一、错误描述: 在 ubuntu 系统上,刚安装的 docker 启动 mysql 后,想通过图形界面 SQLyong 等工具连接 mysql 出现“错误号码2058…

LeetCode---字符串

344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 代码示例: //时间复杂度: O(n) //空间…

tomcat 配置ssl

server.xml ssl 证书分&#xff1a;*.jks、*.pem、*.crt conf 里放入ssl证书文件 <Service name"Catalina">添加建立<Connector >j节点 </service> <Connector port"8443" protocol"org.apache.coyote.http11.Http11NioProto…

测试异步调用

目录 1、 * 测试异步调用 1.1、 Test 1.1.1、 // 三个任务都调用完成,退出循环等待 1.2、 doTaskOne 1.3、 doTaskTwo 1.4、 doTaskThree

跑马灯的两种实现方式

方式一&#xff1a;利用元素尺寸变化监听api&#xff0c;计算宽度&#xff0c;得出时间&#xff0c;进行无限次数动画。 优点&#xff1a;能自定义速度&#xff08;0 - 1&#xff09;。 <template><div class"box"><i class"iconfont icon-gon…

经典获奖案例 | 度小满互联网金融开源软件治理解决方案

近日&#xff0c;广东省粤港澳合作促进会金融专业委员会和粤港澳大湾区金融创新研究院在广州联合举办“2024年粤港澳大湾区数智金融峰会暨第二届金融创新优秀应用案例与解决方案技术成果授牌仪式”。《度小满互联网金融开源软件治理解决方案》从数百个申报项目中脱颖而出&#…

C语言多线程编程:并发控制与同步机制

1. 引言 在多核处理器日益普及的今天&#xff0c;多线程编程已经成为提高程序性能的重要手段。C语言作为一种高效、底层的编程语言&#xff0c;自然也支持多线程编程。本文将带你深入了解C语言多线程编程的奥秘&#xff0c;并分享一些实用的编程技巧。 2. 线程基础 2.1 线程的…

Java线程池:深入理解与高效应用

引言 在现代软件开发中&#xff0c;多线程编程已成为提高应用性能的关键技术之一。Java线程池作为管理线程的一种高效机制&#xff0c;允许我们复用线程&#xff0c;减少线程创建和销毁的开销&#xff0c;并且可以有效地控制并发线程的数量&#xff0c;避免资源耗尽。本专栏旨…

解决VIvado编程中遇到的bug 5

解决VIvado编程中遇到的bug 5 语言 &#xff1a;Verilg HDL EDA工具&#xff1a; Vivado、quartus2 、modelsim 解决VIvado编程中遇到的bug 5一、引言二、问题、分析及解决方法1. vivado编译时报错&#xff08;1&#xff09;错误&#xff08;2&#xff09;分析&#xff08;3&am…