github.com/sandwich-go/boost@v1.3.29/xerror/array.go (about) 1 package xerror 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // ErrorFormatFunc 格式化 error 数组 9 // 调用 Error 时,会将 error 数组进行格式化,默认 ListFormatFunc 10 // 可以通过 SetFormatFunc 函数进行设置 11 type ErrorFormatFunc func([]error) string 12 13 // Array 错误数组,可以将多个 error 进行组装,并当成 error 进行函数传递或返回 14 type Array struct { 15 errors []error 16 formatFunc ErrorFormatFunc 17 } 18 19 // Error 实现 error 接口 20 func (e Array) Error() string { 21 fn := e.formatFunc 22 if fn == nil { 23 fn = ListFormatFunc 24 } 25 return fn(e.errors) 26 } 27 28 // Push 推入一个错误信息,err如果为nil则丢弃 29 func (e *Array) Push(err error) { 30 if err == nil { 31 return 32 } 33 e.errors = append(e.errors, err) 34 } 35 36 // LastErr 返回最后一个错误信息,如果没有错误则返回nil 37 func (e *Array) LastErr() error { 38 if e == nil || len(e.errors) == 0 { 39 return nil 40 } 41 return e.errors[len(e.errors)-1] 42 } 43 44 // Err 返回标准error对象,如果错误列表为空则返回nil 45 func (e *Array) Err() error { 46 if e == nil || len(e.errors) == 0 { 47 return nil 48 } 49 return e 50 } 51 52 // String 53 func (e *Array) String() string { return fmt.Sprintf("*%#v", *e) } 54 55 // WrappedErrors 返回内部所有的 error 56 func (e *Array) WrappedErrors() []error { return e.errors } 57 58 // SetFormatFunc 设置格式化 error 数组函数,默认 ListFormatFunc 59 func (e *Array) SetFormatFunc(f ErrorFormatFunc) { e.formatFunc = f } 60 61 // DotFormatFunc 多个 error,通过 ',' 进行分割输出 62 // 如输出: error 1,error 2 63 var DotFormatFunc = func(es []error) string { 64 var errStr = make([]string, 0) 65 for i := 0; i < len(es); i++ { 66 errStr = append(errStr, es[i].Error()) 67 } 68 return strings.Join(errStr, ",") 69 } 70 71 // ListFormatFunc 多个 error,列表输出 72 // 如输出: 2 errors occurred: 73 // #1: error 1 74 // #2: error 2 75 var ListFormatFunc = func(es []error) string { 76 points := make([]string, len(es)) 77 for i, err := range es { 78 points[i] = fmt.Sprintf("#%d: %s", i+1, err) 79 } 80 return fmt.Sprintf( 81 "%d errors occurred:\n%s", 82 len(es), strings.Join(points, "\n")) 83 }