天津做胎儿鉴定网站,做自动发货网站,定制微信免费下载,邢台网站网页设计文章目录 前言一、概述二、源码理解包函数NewUnwrapIsAsJoin 结构errorStringerrorString方法Error joinErrorjoinError方法ErrorUnwrap 变量ErrUnsupportederrorType 总结 前言
本文章帮助大家对errors包的理解。 一、概述
errors是Go语言内置的标准库之一#xff0c;用于处… 文章目录 前言一、概述二、源码理解包函数NewUnwrapIsAsJoin 结构errorStringerrorString方法Error joinErrorjoinError方法ErrorUnwrap 变量ErrUnsupportederrorType 总结 前言
本文章帮助大家对errors包的理解。 一、概述
errors是Go语言内置的标准库之一用于处理和表示错误。
二、源码理解
包
package errorsimport errors使用errors时需引入此包。
函数
New
func New(text string) error {return errorString{text}
}创建并返回一个错误内容为text的错误errorerrorString。
Unwrap
func Unwrap(err error) error {u, ok : err.(interface {Unwrap() error})if !ok {return nil}return u.Unwrap()
}返回err的拆包结果error。若err没有Unwrap() error方法返回空。
Is
func Is(err, target error) bool { /*...*/ }若err错误树中包含匹配target错误的错误则返回true。
重点错误树包含错误本身然后通过Unwrap方法重复地拆包出错误为深度优先的先序遍历。匹配是指相等或者实现了Is(error) bool方法且Is(target)返回true。
注意这里Unwrap方法可能返回error或者[]error。若返回前者对其继续进行比较若返回后者遍历其元素对它们逐个进行比较。只要出现任意一个匹配即可终止比较。
As
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。
Join
func Join(errs ...error) error { /*...*/ }将所有errs错误包装成一个错误errorjoinError。若所有错误都是空则返回空。
重点非空结果实现了Unwrap() []error方法错误内容为各错误内容的拼接用换行符拼接。
注意空的错误会被丢弃。
结构
errorString
type errorString struct {s string
}是error接口的简单实现。s表示错误的内容。
errorString方法
Error
func (e *errorString) Error() string {return e.s
}实现error接口。返回错误内容。
joinError
type joinError struct {errs []error
}是error接口的一种实现表示由多个错误拼接的错误。errs表示这多个错误的切片。
joinError方法
Error
func (e *joinError) Error() string {var b []bytefor i, err : range e.errs {if i 0 {b append(b, \n)}b append(b, err.Error()...)}return string(b)
}实现error接口。返回用换行符拼接的错误的内容。
Unwrap
func (e *joinError) Unwrap() []error {return e.errs
}
返回此错误的拆包结果[]error。
变量
ErrUnsupported
var ErrUnsupported New(unsupported operation)表示操作不支持的错误。 函数、方法不应该返回此错误而应该返回包含一个恰当上下文的错误该上下文满足errors.Is(err, errors.ErrUnsupported)可通过直接包装ErrUnsupported或实现Is方法来实现该错误。 errorType
var errorType reflectlite.TypeOf((*error)(nil)).Elem()error元素的类型。 总结
新人源码理解望大家多多指点。