error接口

// 实际上它是interface类型,这个类型有一个返回错误信息的单一方法:
type error interface{
    Error() string
}

创建一个error最简单的方法就是调用errors.New函数,它会根据传入的错误信息返回一个新的error。整个errors包仅只有4行:
package errors
// New函数返回指针errorString结构体实例化对象
func New(text string) error {return &errorString{text}}
type errorString struct { text string }
// errorString的Error()方法,返回它结构体中定义的text属性
func (e *errorString) Error() string  { return e.text }

承载errorString的类型是一个结构体而非一个字符串,这是为了保护它表示的错误避免粗心(或有意)的更新。并且因为指针类型*errorString满足error接口而非errorString类型,所以每个New函数的调用都分配了一个独特的和其它错误不相同的实例。我们也不想要重要的error例如io.EOF和一个刚好有相同错误消息的error比较后相等。
fmt.Println(errors.New("EOF") == errors.New("EOF")) // false

调用errors.New函数是非常稀少的,因为有一个方便的封装函数fmt.Errorf,它会处理字符串格式化。
package fmt
import "errors"
func Errorf(format string, args ...interface{}) error{
    return errors.New(Sprintf(format, args...))
}


posted @ 2022-03-01 14:03  我在路上回头看  阅读(106)  评论(0)    收藏  举报