本文章帮助大家对errors
包的理解。
errors
是Go语言内置的标准库之一,用于处理和表示错误。
package errors
import "errors"
使用errors
时,需引入此包。
func New(text string) error {
return &errorString{text}
}
创建并返回一个错误内容为text
的错误error
(errorString
)。
func Unwrap(err error) error {
u, ok := err.(interface {
Unwrap() error
})
if !ok {
return nil
}
return u.Unwrap()
}
返回err
的拆包结果(error
)。若err
没有Unwrap() error
方法,返回空。
func Is(err, target error) bool { /*...*/ }
若err
错误树中包含匹配target
错误的错误,则返回true
。
重点:错误树包含错误本身,然后通过Unwrap
方法重复地拆包出错误,为深度优先的先序遍历。匹配是指相等或者实现了Is(error) bool
方法且Is(target)
返回true
。
注意:这里Unwrap
方法可能返回error
或者[]error
。若返回前者,对其继续进行比较;若返回后者,遍历其元素,对它们逐个进行比较。只要出现任意一个匹配即可终止比较。
func As(err error, target any) bool { /*...*/ }
若err
错误树中包含匹配target
错误的错误,将target
设为该错误,返回true
。类似Is
方法。
重点:匹配是指错误具体值可以赋给target
或者实现了As(interface{}) bool
方法且As(target)
返回true
。
注意:type any = interface{}
。若err
非空且target
不是指向实现了error
或any
接口的类型的非空指针,则panic
。
func Join(errs ...error) error { /*...*/ }
将所有errs
错误包装成一个错误error
(joinError
)。若所有错误都是空,则返回空。
重点:非空结果实现了Unwrap() []error
方法,错误内容为各错误内容的拼接,用换行符拼接。
注意:空的错误会被丢弃。
type errorString struct {
s string
}
是error
接口的简单实现。s
表示错误的内容。
func (e *errorString) Error() string {
return e.s
}
实现error
接口。返回错误内容。
type joinError struct {
errs []error
}
是error
接口的一种实现,表示由多个错误拼接的错误。errs
表示这多个错误的切片。
func (e *joinError) Error() string {
var b []byte
for i, err := range e.errs {
if i > 0 {
b = append(b, '\n')
}
b = append(b, err.Error()...)
}
return string(b)
}
实现error
接口。返回用换行符拼接的错误的内容。
func (e *joinError) Unwrap() []error {
return e.errs
}
返回此错误的拆包结果([]error
)。
var ErrUnsupported = New("unsupported operation")
表示操作不支持的错误。
函数、方法不应该返回此错误,而应该返回包含一个恰当上下文的错误,该上下文满足
errors.Is(err, errors.ErrUnsupported)
,可通过直接包装ErrUnsupported
,或实现Is
方法来实现该错误。
var errorType = reflectlite.TypeOf((*error)(nil)).Elem()
error
元素的类型。
新人源码理解,望大家多多指点。