1062 字
约 3 分钟
8
15. Go语言error
2026-09-25
无标签
  1. Go语言error 秀才 2025年2月14日 大约 4 分钟 Go语言 Go语言 golang go基础语法 error 此页内容 1. error是什么 2. 自定义error对象 在 Go 语言开发中,我们会多次用到 error 这个东西,尤其是在函数的返回值上,由于 go 的函数支持多返回值,所以一般会用 error 作为其中一个返回值,代表该函数执行过程中或者逻辑有出错,那究竟 error 是个什么东西呢,下面我们就来一探究竟。 1. error是什么 error 其实是Go语言的一个接口类型,就是一个普通的接口,并且也不会携带任何的堆栈信息。 接口的定义如下:
type error interface {
 Error() string
}

通常我们会使用 errors.New() 或者 fmt.Errorf() 来返回一个 error 对象,但是需要注意,通过这两种方式返回的 error 对象都是不可以进行比较的,因为 errors.New() 返回的其实是一个地址,不能用来做等值判断,如果要是先等值判断,需要自己实现,而 fmt.Error() 的内部其实也是用到了 errors.New() 。 errors.New() 函数实现:

func New(text string) error {
 return &errorString{text}
}

fmt.Errorf() 实现:

func Errorf(format string, a ...interface{}) error {
 p := newPrinter()
 p.wrapErrs = true
 p.doPrintf(format, a)
 s := string(p.buf)
 var err error
 if p.wrappedErr == nil {
 err = errors.New(s)
 } else {
 err = &wrapError{s, p.wrappedErr}
 }
 p.free()
 return err
}

代码展示:

package main

import (
 "fmt"
 "errors"
)
// 定义一个正数自加的函数,当传入的整数小于等于0的时候报错
func getPositiveSelfAdd(num int) (int,error) {
 if num <=0 {
 return -1,fmt.Errorf("num is not a positive number")
 }
 return num+1,nil
}

func main() {
 num1,err1 := getPositiveSelfAdd(1)
 fmt.Printf("nums is %d, err is %v\n",num1 ,err1)
 
 num2,err2 := getPositiveSelfAdd(-2)
 fmt.Printf("nums is %d, err is %v\n",num2 ,err2)
 
 err3 := errors.New("hello")
 err4 := errors.New("hello")
 fmt.Println(err3==err4)
 
 fmt.Println(err3.Error()==err4.Error())
}

运行结果:

nums is 2, err is <nil>
nums is -1, err is num is not a positive number
false
false

通过样例可以看到,通过上述方法创建出的两个 error 对象是不能直接比较的,即便是 error 信息一样,也会返回 false ,如果我们想要比较,可以通过 Error() 方法拿到其中的 error 字符串信息,比较字符串。 2. 自定义error对象 Go语言内置的 error 创建方法非常简单,也易上手,但是有时候并不能满足我们的业务要求,因为他只返回了错误信息,类似于 error 的 message ,但是很多时候我们业务上还需要错误码,即 error code 。所以,很多时候我们可以自定义 error 对象。

type MyError struct {
 code int
 msg string
}

对象定义完之后,接下来只需要实现 error 接口的 Error 方法即可,这样,我们就自定义了一个同时带有错误码和错误信息的error对象。 下面请看具体例子:

package main

import "fmt"

type MyError struct {
 code int
 msg string
}

func (m MyError) Error() string {
 return fmt.Sprintf("code:%d,msg:%v", m.code, m.msg)
}

func NewError(code int, msg string) error {
 return MyError{
 code: code,
 msg: msg,
 }
}

func Code(err error) int {
 if e, ok := err.(MyError); ok {
 return e.code
 }
 return -1
}

func Msg(err error) string {
 if e, ok := err.(MyError); ok {
 return e.msg
 }
 return ""
}

func main() {
 err := NewError(100, "test MyError")
 fmt.Printf("code is %d, msg is %s", Code(err), Msg(err))
}

运行结果:

code is 100, msg is test MyError

关注秀才公众号: IT杨秀才 ,领取精品学习资料 公众号后台回复: Go面试 ,领取Go面试题库PDF 公众号后台回复: Go学习 ,领取Go必看书籍 公众号后台回复: 大模型 ,领取大模型学习资料 公众号后台回复: 111 ,领取架构学习资料 公众号后台回复: 26届秋招 ,领取26届秋招企业汇总表

🔥 配套实战项目,拆得开、跑得起、能写进简历 多 Agent 编排 + RAG 混合检索 · 31 篇深度教程 + 50+ 面试题 点击查看 DevSupport AI 实战项目 → 在 GitHub 上编辑此页 上次编辑于: 2026/6/24 23:41:22 贡献者: Percygu , Your Name , gupeng 上一页 14. Go语言接口 下一页 16. Go语言defer

15. Go语言error
https://clxhxhhr.top/posts/3614/
作者
clxstart
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。