Golang 中的 errors 包详解

文章介绍了Golang中errors包的使用,包括errors.New创建错误对象,errors.Is判断错误类型,errors.As转换错误类型,以及errors.Unwrap展开错误。这些函数帮助开发者更好地管理和处理错误信息。
摘要由CSDN通过智能技术生成

在 Golang 中,errors 包是用于处理错误的标准库, errors 包提供的功能比较简单,使用起来非常方便。接下来就具体讲解一下 errors 包提供的几个函数。

errors.New

func New(text string) error

错误处理是开发过程中必不可少的,使用 errors.New 函数可以创建一个表示特定错误的对象。接受一个字符串类型的参数(用于描述错误信息),返回一个 error 类型的值。例如:

package main

import "errors"

func main() {
	err := errors.New("invalid input")
}

error 类型是 builtin 包中定义的一个接口,定义如下:

type error interface {
	Error() string
}

可以看出此接口定义了一个基本的 Error 方法,用于返回错误的描述信息。

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := errors.New("invalid input")
	errDesc := err.Error()
	fmt.Println(errDesc) // 输出 invalid input
}

errors.Is

func Is(err, target error) bool

用于判断给定的错误是否是目标错误类型或者基于目标错误类型包装过的错误,会递归检查错误链,直到找到目标错误类型或者到达错误链的末尾。如果找到目标错误类型,则返回true,否则返回false。看个例子:

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := errors.New("invalid input")
	err1 := errors.New("invalid input")
	err2 := fmt.Errorf("err2: [%w]", err)
	fmt.Println(errors.Is(err1, err)) // false
	fmt.Println(errors.Is(err2, err)) // true
}

因为 err 和 err1 都是使用 errors.New 函数创建的,所以使用 Is 判断会返回 false。err2 是基于 err 包装出来的,所以使用 Is 判断会返回 true。

errors.AS

func As(err error, target any) bool

用于将错误转换为特定类型的错误,As 函数会检查 err 是否是 target 指向的类型的实例,如果是,将该实例赋值给 target 并返回 true。否则返回 false。看个例子:

package main

import (
	"errors"
	"fmt"
)

type MyError struct {
	Message string
}

func (e *MyError) Error() string {
	return e.Message
}
func main() {
	err := &MyError{
		Message: "This is a custom error",
	}
	var target *MyError
	if errors.As(err, &target) {
		fmt.Println("Custom error found:", target.Message)
	} else {
		fmt.Println("Custom error not found")
	}
}

使用 errors.As 来检查 err 是否是 MyError 类型的实例,并将实例赋值给 target。运行一下示例看下效果

$ go run main.go
Custom error found: This is a custom error

这个功能通常用于处理不同类型的错误,根据错误的类型采取对应的处理方式。

errors.Unwrap

func Unwrap(err error) error

用于将一个错误对象展开,得到下一层错误对象,如果错误对象没有下一层错误对象,则返回 nil。看个例子:

package main

import (
	"errors"
	"fmt"
)

func main() {
  originalErr := errors.New("original error")
	err := fmt.Errorf("error: %w", originalErr)
	unwrappedErr := errors.Unwrap(err)
	fmt.Println(unwrappedErr) // 输出: original error
}

使用 fmt.Errorf 函数将 originalErr 做了一层包装后得到 err,然后通过使用 Unwrap 将 err 解包并得包装前的错误对象 originalErr。需要注意的是 Unwrap 只能展开被 fmt.Errorf 包装的错误对象。如果想要展开其他类型的错误对象,可以使用类型断言操作符 `.` 进行类型断言。

小结

errors 包提供了一些简单易用的函数来处理和获取错误信息,借助 errors 包可以实现非常强大的错误处理功能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Go,接口是一个使用非常广泛的概念,可以让您以一种非常灵活的方式编写代码,同时保持代码的可读性和可维护性。接口是一种类型,它定义了一组方法,这些方法可以被不同的类型实现。下面是一些关于Go接口的详细信息: 1. 接口是一种类型。 在Go,接口是一种类型,它定义了一组方法。一个类型可以实现一个或多个接口。 2. 接口定义方法。 接口是由一组方法定义的,这些方法没有实现。一个类型可以实现接口定义的所有方法,只要它们按照接口定义的方式进行实现即可。 3. 接口实现。 一个类型可以实现一个或多个接口。一个类型只需要实现接口定义的所有方法,就可以称之为实现了这个接口。 4. 接口的实现是隐式的。 在Go,接口的实现是隐式的。一个类型只需要实现接口定义的所有方法,就可以自动实现这个接口。 5. 接口变量和接口值。 接口变量是一个接口类型的变量,它可以存储任何实现了该接口的值。接口值是一个接口类型的值,它可以存储任何实现了该接口的值。 6. 空接口。 空接口是一种不含任何方法的接口。它可以存储任何类型的值。 7. 类型断言。 类型断言是一种将接口值转换为其他类型的方法。如果转换失败,它会返回一个零值和一个错误。 8. 接口的嵌套。 接口的嵌套是一种将多个接口组合成一个新接口的方法。新接口含了所有组合接口的方法。 9. 接口的多态性。 接口的多态性是一种让不同类型的对象可以以相同的方式进行处理的方法。这样可以让您的代码更加灵活和可维护。 以上是关于Go接口的一些概念和用法的详细介绍。如果您想要更深入地了解接口,可以参考Go的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路多辛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值