pkg/errors
和github.com/pkg/errors
,以帮助大家更好地理解它们的差别,并做出适合自己项目的选择。
pkg/errors
是从Go 1.13版本开始,标准库errors
增加的一部分。它的主要功能是提供了一种新的错误处理模式,即As
,Is
和Unwrap
。
errors.As
:检查错误的链是否有匹配的错误类型。errors.Is
:检查错误链中是否存在特定的错误。errors.Unwrap
:返回错误中的下一个错误。它也引入了fmt.Errorf
的%w
占位符,这个占位符可以创建一个包装了原始错误的新错误。这种错误可以被Unwrap
函数解包。
err := fmt.Errorf("an error occurred: %w", originalError)
github.com/pkg/errors
是在Go 1.13版本之前,用于扩展Go错误处理能力的一个第三方库。它的功能比标准库的pkg/errors
更加丰富。最重要的一点是,github.com/pkg/errors
可以保存和打印错误发生时的堆栈信息。
err := errors.Wrap(originalError, "an error occurred")
fmt.Printf("%+v", err) // 打印错误和堆栈信息
此外,github.com/pkg/errors
也提供了Cause
函数,这个函数和标准库的Unwrap
函数类似,可以获取到被包装的原始错误。
如果你的项目使用的Go版本在1.13及以上,那么你可以优先选择标准库的pkg/errors
,因为它是标准库的一部分,无需引入额外的依赖,并且它和新的Go错误处理惯例相兼容。
但是,如果你需要保存和打印错误的堆栈信息,那么你应该选择github.com/pkg/errors
。需要注意的是,github.com/pkg/errors
的Wrap
函数和标准库的fmt.Errorf
的%w
占位符有一些不同。如果你在用github.com/pkg/errors
的代码中混用了fmt.Errorf
的%w
,那么你需要使用errors.Unwrap
或errors.Is
、errors.As
来获取原始错误,而不能使用github.com/pkg/errors
的Cause
函数。
最后,你应该避免在同一个项目中混用这两个库,以避免混乱。