详解Golang中errors包如何返回自定义error类型

 更新时间:2023年09月07日 09:34:13   作者:路多辛  
这篇文章主要为大家详细介绍了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 main
import (
    "errors"
    "fmt"
)
// 自定义的错误类型
type MyError struct {
    code int64
    msg  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 main
import (
    "errors"
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
)
// 自定义的错误类型
type MyError struct {
    code int64
    msg  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类型的文章就介绍到这了,更多相关go errors内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Go如何实现协程并发执行

    详解Go如何实现协程并发执行

    线程是通过本地队列,全局队列或者偷其它线程的方式来获取协程的,目前看来,线程运行完一个协程后再从队列中获取下一个协程执行,还只是顺序执行协程的,而多个线程一起这么运行也能达到并发的效果,接下来就给给大家详细介绍一下Go如何实现协程并发执行
    2023-08-08
  • golang mysql的连接池的具体使用

    golang mysql的连接池的具体使用

    本文主要介绍了golang mysql的连接池的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Go 代码块作用域变量遮蔽问题解析

    Go 代码块作用域变量遮蔽问题解析

    这篇文章主要为大家介绍了Go 代码块作用域变量遮蔽问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 深入解析Go语言编程中slice切片结构

    深入解析Go语言编程中slice切片结构

    这篇文章主要介绍了Go语言编程中slice切片结构,其中Append方法的用法介绍较为详细,需要的朋友可以参考下
    2015-10-10
  • GO语言实现日志切割的示例详解

    GO语言实现日志切割的示例详解

    日志记录对程序排查问题比较关键,所以本文将选择Logrus和lumberjack两个库进行日志切割以及记录调用源,感兴趣的小伙伴可以了解一下
    2023-07-07
  • 手把手教你如何在Goland中创建和运行项目

    手把手教你如何在Goland中创建和运行项目

    欢迎来到本指南!我们将手把手地教您在Goland中如何创建、配置并运行项目,通过简单的步骤,您将迅速上手这款强大的集成开发环境(IDE),轻松实现您的编程梦想,让我们一起开启这段精彩的旅程吧!
    2024-02-02
  • golang 比较浮点数的大小方式

    golang 比较浮点数的大小方式

    这篇文章主要介绍了golang 比较浮点数的大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang中select语句的简单实例

    golang中select语句的简单实例

    Go的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的,下面这篇文章主要给大家介绍了关于golang中select语句的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • GO语言基本数据类型总结

    GO语言基本数据类型总结

    这篇文章主要介绍了GO语言基本数据类型,较为详细的总结了GO语言的基本数据类型,对于GO语言的学习有一定的借鉴参考价值,需要的朋友可以参考下
    2014-12-12
  • Go语言基础学习之Context的使用详解

    Go语言基础学习之Context的使用详解

    在Go语言中,Context是一个非常重要的概念,它用于在不同的 goroutine 之间传递请求域的相关数据,本文将深入探讨Go语言中 Context特性和Context的高级使用方法,希望对大家有所帮助
    2023-05-05

最新评论