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,一经查实,立即删除!

相关文章

数论1---整除

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

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(…

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

文章目录 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) //空间…

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

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

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

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

解决VIvado编程中遇到的bug 5

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

YOLOv8 多种任务网络结构详细解析 | 目标检测、实例分割、人体关键点检测、图像分类

前言 本文仅根据模型的预测过程,即从输入图像到输出结果(图像预处理、模型推理、后处理),来展现不同任务下的网络结构,OBB 任务暂不包含。 Backbone 1. yolov8m 2. yolov8m-p2 3. yolov8m-p6 4. 细节 图中 CBS Con…

DALL·E 2详解:人工智能如何将您的想象力变为现实!

引言 DALLE 2是一个基于人工智能的图像生成模型,它通过理解自然语言描述来生成匹配这些描述的图像。这一模型的核心在于其创新的两阶段工作流程,首先是将文本描述转换为图像表示,然后是基于这个表示生成具体的图像。 下面详细介绍DALL-E2的功…

Java高级---Spring Boot---3快速入门

3 Spring Boot快速入门 3.1 创建第一个Spring Boot项目 使用IntelliJ IDEA和Spring Initializr创建项目 打开IntelliJ IDEA 并选择 “Start a new project”。在新建项目向导中,选择 “Spring Initializr”。填写项目基本信息: Group: 定义项目组&…

C#使用GDI对一个矩形进行任意角度旋转

C#对一个矩形进行旋转GDI绘图,可以指定任意角度进行旋转 我们可以认为一张图片Image,本质就是一个矩形Rectangle,旋转矩形也就是旋转图片 在画图密封类 System.Drawing.Graphics中, 矩形旋转的两个关键方法 //设置旋转的中心点 public v…

生成随机图片

package com.zhuguohui.app.lib.tools;/*** Created by zhuguohui* Date: 2024/6/1* Time: 13:39* Desc:获取随机图片*/ public class RandomImage {// static final String url "https://picsum.photos/%d/%d?random%d";static final String url "https://…

FPGA定点数FFT过后转换为浮点数与Matlab计算的FFT结果进行比对

目录 1.前言2.FPGA的testbench中如何读取数据文件3.FPGA的testbench中如何将输出数据存储在文件中4.Matlab去读取testbench存储的文件数据4.1纯数字不带编码4.2 带编码的数据,如定点数 微信公众号获取更多FPGA相关源码: 1.前言 前面一篇文章讲了&…

ESP32-C3模组上实现蓝牙BLE配网功能(2)

接前一篇文章:ESP32-C3模组上实现蓝牙BLE配网功能(1) 本文内容参考: 《ESP32-C3 物联网工程开发实战》 乐鑫科技 蓝牙的名字由来是怎样的?为什么不叫它“白牙”? 特此致谢! 一、蓝牙知识基础…