Golang 中的 errors 包详解:返回自定义 error 类型
之前的文章《Golang 中的 errors 包详解》详细讲解了 errors 包的主要类型和函数,以及它们的使用方法。本文结合之前讲解的知识,来讲解一下根据自己或团队的项目要求如何返回自定义的 error 类型。
为什么需要自定义 error 类型?
在日常开发中,返回自定义 error 类型是一种很常见的做法,因为很多场景下标准库 errors 包中的 error 类型并不能满足需求。例如开发 web 项目时,常见的返回结构可能如下:
{"code":xxx, "data":yyy,"msg":"zzz"}
code 为状态码,data 为接口返回的业务数据,msg 为错误信息。针对这种响应结构,一般做法是调用处理业务逻辑的函数或方法,返回业务数据和 error,然后在 api 层拼装成这种结构。所以 error 对象至少要包含状态码 code 和错误信息 msg,这时候就需要实现自己的 error 类型了。
如何实现自定义 error 类型?
在 Golang 中,可以通过创建一个实现了 error 接口(该接口仅包含一个 Error 方法)的结构体来返回自定义的 error 类型。自定义的 error 类型可以包含自己定义的字段和方法,以提供更多的错误信息和上下文信息。看一个示例来展示如何创建和返回自定义 error 类型:
package mainimport ("errors""fmt"
)// 自定义的错误类型
type MyError struct {code int64msg string
}// 实现error接口的Error方法
func (e MyError) Error() string {return fmt.Sprintf("Error: [%d] %s", e.code, e.msg)
}func (e MyError) Code() int64 {return e.code
}func (e MyError) Msg() string {return e.msg
}// 函数示例,返回自定义error类型
func doSomething() error {err := MyError{code: 500,msg: "Something went wrong",}return err
}func main() {err := doSomething()if err != nil {fmt.Println(err)}// 比较自定义error类型myErr := MyError{code: 500,msg: "Something went wrong",}equal := errors.Is(err, myErr)fmt.Println(equal) // true
}
在上述示例中,首先定义了一个自定义的 MyError 类型,包含 code 和 msg 两个字段,然后实现 error 接口要求的 Error 方法。
接下来再看一个结合 gin 框架的具体使用示例,简单示例代码如下:
package mainimport ("errors""fmt""github.com/gin-gonic/gin""net/http"
)// 自定义的错误类型
type MyError struct {code int64msg string
}func NewError(code int64, msg string) MyError {return MyError{code: code,msg: msg,}
}// 实现error接口的Error方法
func (e MyError) Error() string {return fmt.Sprintf("Error: [%d] %s", e.code, e.msg)
}func (e MyError) GetCode() int64 {return e.code
}func (e MyError) GetMsg() string {return e.msg
}// 函数示例,返回自定义error类型
func doSomething() error {err := MyError{code: 500,msg: "Something went wrong",}return err
}func FromError(err error) MyError {if err == nil {return NewError(1, "")}if !errors.As(err, &MyError{}) {return NewError(-1, "")}return err.(MyError)
}func TestHandler(c *gin.Context) {err := Logic()if err != nil {e := FromError(err)c.JSON(http.StatusOK, gin.H{"code": e.GetCode(), "data": nil, "msg": e.GetMsg()})return}c.JSON(http.StatusOK, gin.H{"code": 1, "data": nil, "msg": ""})
}func Logic() error {return NewError(-1, "something went wrong")
}func main() {r := gin.New()r.GET("/test", TestHandler)r.Run(":8080")
}
小结
通过返回自定义的 error 类型,可以提供更多的错误信息和上下文信息,使错误处理更加灵活和准确,可以根据自己的实际需求和应用场景创建自定义错误类型。
相关文章:
Golang 中的 errors 包详解:返回自定义 error 类型
之前的文章《Golang 中的 errors 包详解》详细讲解了 errors 包的主要类型和函数,以及它们的使用方法。本文结合之前讲解的知识,来讲解一下根据自己或团队的项目要求如何返回自定义的 error 类型。 为什么需要自定义 error 类型? 在日常开发…...
C#开发的OpenRA游戏之信标按钮
前面已经分析了两个按钮:变卖和维修,接着下来就是分析信标按钮,这个按钮使用是比较少,但是对于多人游戏时,使用这个信号就很方便同盟军过来查看和帮助了,相当于一个朋友之间共同查看的地址。当你经过同盟标记的标志时,就会听到beacon detected,检测到信标,这就是你的盟…...
16字节协议的串口通信
1.协议要求 协议为帧传输,一共16字节。主要是2字节的固定帧头 EB 90,2字节的帧计数(用来计数发出的帧),10字节的数据和2字节的校验位 帧头:2字节,固定值 8’HEB、8’H90 帧计数:2字节,用来说明发出去帧是…...
升哲科技城市级“算力+数字底座”服务亮相2023服贸会
9月2日至6日,以“开放引领发展,合作共赢未来”为主题的2023年中国国际服务贸易交易会在北京隆重举办。作为城市级数据服务商,升哲科技(SENSORO)连续第四年参加服贸会,携城市级“算力数字底座”服务及在城市…...
动态规划之简单多状态
简单多状态 1. 按摩师(easy)2. 打家劫舍II (medium)3. 删除并获得点数(medium)4. 买卖股票的最佳时机含冷冻期(medium)5. 买卖股票的最佳时机III(hard) 1. 按…...
跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展
云数据中心里,为什么需要DCI互通? 云化数据中心,网络资源通过虚拟化技术形成资源池,实现业务与物理网络解耦,通过网络虚拟化,物理网络资源可以被分成多个虚拟网络资源,从而提高网络资源的使用效…...
upload-labs靶场通关详解
文章目录 Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16Pass-17Pass-18Pass-19Pass-20方法一(文件夹名欺骗绕过)方法二(%00截断攻击) Pass-21 Pass-01 绕过…...
Leetcode刷题笔记--Hot41-50
1--二叉树的层序遍历(102) 主要思路: 经典广度优先搜索,基于队列; 对于本题需要将同一层的节点放在一个数组中,因此遍历的时候需要用一个变量 nums 来记录当前层的节点数,即 nums 等于队列元素的…...
「MySQL-02」数据库的操纵、备份、还原和编码规则
目录 一、库操作 1. 创建数据库 2. 查看所有数据库 3. 删除数据库 4. 修改数据库 5. 进入一个数据库 二、查看和设置数据库的编码规则 1. MySQL的两个编码规则:字符集和校验规则 2. 查看MySQL当前使用的字符集以及校验规则 3. 查看MySQL支持的所有字符集 4. 查看MyS…...
Effective C++条款24——若所有参数皆需类型转换,请为此采用non-member涵数(设计与声明)
我在导读中提过,令classes支持隐式类型转换通常是个糟糕的主意。当然这条规则有其例外,最常见的例外是在建立数值类型时。假设你设计一个class用来表现有理数,允许整数“隐式转换”为有理数似乎颇为合理。的确,它并不比C内置从int…...
决策工具箱:战略分析必备工具与框架
跟随时代的步伐,企业战略也在不断演化。无论是初创企业还是知名企业,都需要有效的战略工具来指导其业务发展。探索这些必备工具,并学习如何最大限度地利用它们,是企业的一个学习目标。 战略分析工具和框架有很多,其中…...
【压力测试指南】没有任何文档,小白也可以做的压力测试
前言 一般在执行压力测试之前,会由开发提供出接口文档,包含一些接口的详细参数,便于测试工程师编写测试脚本。但在某些情况下,接口等相关文档缺失,那作为Tester,我们该如何顺利的实施压力测试呢࿱…...
Linux: memory: memblock: debug
文章目录 代码memblock=debug实例log代码 将内存相关的一些日志打开: static int __init early_memblock(char *p) {if (p && strstr(p, "debug")...
搬家快递服务小程序的便利性
在当今快节奏的生活中,搬家可能是很多人都需要面对的问题。无论是新房子还是新办公室,都需要高效、便捷的搬家服务。本文将介绍如何使用第三方小程序制作平台,如乔拓云平台,开发一款高效便捷的搬家服务小程序。 1. 注册登录第三方…...
软件架构师 Debugging
软件架构师 Debugging 目录概述需求: 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survi…...
7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)
C自学精简教程 目录(必读) 作业目标: 这个作业中,你需要综合运用之前文章中的知识,来解决一个相对完整的应用程序。 作业描述: 1 在这个作业中你需要在文本文件中存储学生通讯录的信息,并在程序启动的时候加载这些…...
学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在
学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在 doesObjectExist doesObjectExist 主要函数doesObjectExist /*** Base64上传文件* param string|array $images* param string $model_path* param string $model_type* param string $upload_path* param…...
重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!
引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face! Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型,有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数…...
Linux命令行
目录 CLI GUI 命令行界面 图形界面 命令行提示符 # $ 编辑 命令一般由三个部分组成 历史命令,使用上下键,或者使用history,ctrlr搜索历史命令 通配符 *,? 切换用户 su 作业管理 &,jobs,bg,fg CLI GUI 命令行界面 …...
[持续更新]计算机经典面试题基础篇Day1
[通用]计算机经典面试题基础篇Day1 1、jvm的组成 类加载器(Class Loader):负责将编译后的Java类加载到JVM中,并在运行时动态加载所需的类。运行时数据区(Runtime Data Area):是JVM的内存管理区…...
华为HCSP认证备考全攻略:5G网优方向
华为HCSP(Huawei Certified Service Professional)认证是5G网优行业的重要资质认证。本文从考试内容、备考策略、真题分析三个维度,帮你一次性通过考试。一、HCSP认证体系概览1.1 认证等级等级全称定位考试难度薪资加成HCIAHuawei Certified …...
Spring Boot Microservices故障排查:10个常见问题及解决方案
Spring Boot Microservices故障排查:10个常见问题及解决方案 【免费下载链接】spring-boot-microservices Spring Boot Template for Micro services Architecture - Show cases how to use Zuul for API Gateway, Spring OAuth 2.0 as Auth Server, Multiple Resou…...
利用coze使用无代码平台搭建图片识别机器人
利用coze使用无代码平台搭建图片识别机器人 无代码平台允许用户通过可视化界面快速创建聊天机器人,无需编程基础。例如,扣子(Coze) 是一个由字节跳动开发的智能体应用开发平台,支持集成多种大语言模型(如 …...
Claude Code提示词入门:CLAUDE.md编写完全指南
目录Claude Code提示词入门:CLAUDE.md编写完全指南 🎯📌 目录1. 什么是CLAUDE.md2. 为什么CLAUDE.md这么重要2.1 没有CLAUDE.md会怎样?2.2 有了CLAUDE.md会怎样?2.3 核心价值3. CLAUDE.md的加载机制3.1 加载优先级3.2 …...
Linux内核进程调度:从CFS原理到性能调优实战
1. 项目概述:为什么我们要关心Linux内核的进程调度?如果你在服务器上跑过业务,或者写过需要高并发的程序,大概率遇到过这样的场景:系统负载突然飙升,某个进程“卡死”了,或者多线程程序的性能总…...
回声干扰导致TTS通过率暴跌41%?ElevenLabs生产环境回声抑制黄金配置,仅限内部团队使用的7项阈值标准
更多请点击: https://intelliparadigm.com 第一章:回声干扰对TTS语音质量的致命影响 回声干扰(Echo Interference)是实时TTS(Text-to-Speech)系统在语音合成与播放耦合场景中极易被忽视却极具破坏性的声学…...
零基础实战:在AutoDL云端一键部署GPT-SoVITS并实现音色克隆API调用
1. 为什么选择AutoDL部署GPT-SoVITS 第一次接触音色克隆技术时,我和很多人一样被两个问题困扰:本地电脑配置不够怎么办?复杂的Linux环境怎么配置?直到发现AutoDL这个云端算力平台,所有问题迎刃而解。这里实测用RTX3090…...
PrismLauncher-Cracked:当网络离线时,你还能畅玩Minecraft吗?
PrismLauncher-Cracked:当网络离线时,你还能畅玩Minecraft吗? 【免费下载链接】PrismLauncher-Cracked This project is a Fork of Prism Launcher, which aims to unblock the use of Offline Accounts, disabling the restriction of havin…...
深度剖析APK Installer:Windows平台Android应用安装的专业解决方案
深度剖析APK Installer:Windows平台Android应用安装的专业解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows平台设计…...
阿里图像复原验证码识别
一、简介 这个就是阿里的图像还原验证码,他是从一个图片中任意抠出一个物品,可能是蜡烛、车轮、盘子、瓶子、盖子、扣子等等。然后让你通过鼠标拖动的方式,把物品拖到对应的位置上,完成图像复原验证。 这个验证码还有一个非常变态…...
