详解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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang协程池设计详解

    golang协程池设计详解

    这篇文章主要介绍了golang协程池设计详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • go语言写的简要数据同步工具详解

    go语言写的简要数据同步工具详解

    作为go-etl工具的作者,想要安利一下这个小巧的数据同步工具,它在同步百万级别的数据时表现极为优异,基本能在几分钟完成数据同步,这篇文章主要介绍了go语言写的简要数据同步工具,需要的朋友可以参考下
    2024-07-07
  • 详解Golang如何优雅判断interface是否为nil

    详解Golang如何优雅判断interface是否为nil

    这篇文章主要为大家详细介绍了Golang如何优雅判断interface是否为nil的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解下
    2024-01-01
  • Go 语言入门之Go 计时器介绍

    Go 语言入门之Go 计时器介绍

    这篇文章主要介绍了Go 语言入门之Go 计时器,文章基于GO语言的相关资料展开对其中计时器的详细内容。具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 详解Golang中interface{}的注意事项

    详解Golang中interface{}的注意事项

    学习 golang ,对于 interface{} 接口类型,我们一定绕不过,这篇文章咱们就来一起来看看 使用 interface{} 的时候,都有哪些注意事项吧
    2023-03-03
  • Go Excelize API源码解读GetSheetViewOptions与SetPageLayout

    Go Excelize API源码解读GetSheetViewOptions与SetPageLayo

    这篇文章主要为大家介绍了Go Excelize API源码解读GetSheetViewOptions与SetPageLayout方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go实现文件分片上传

    Go实现文件分片上传

    这篇文章主要为大家详细介绍了Go实现文件分片上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 使用go来操作redis的方法示例

    使用go来操作redis的方法示例

    今天小编就为大家分享一篇关于使用go来操作redis的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • golang中实现给gif、png、jpeg图片添加文字水印

    golang中实现给gif、png、jpeg图片添加文字水印

    这篇文章主要介绍了golang中实现给gif、png、jpeg图片添加文字水印,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • go语言切片slice使用细节和注意事项整理大全

    go语言切片slice使用细节和注意事项整理大全

    这篇文章主要给大家介绍了关于go语言切片slice使用细节和注意事项整理的相关资料,需要的朋友可以参考下
    2024-05-05

最新评论