Fetch the repository succeeded.
package errors
import (
"fmt"
"net/http"
"sync"
)
//根据 code 默认展示信息的接口
var (
unknownCoder defaultCoder = defaultCoder{1, http.StatusInternalServerError, "An internal server error occurred", "http://github.com/marmotedu/errors/README.md"}
)
// 定义错误代码详细信息定义接口
// 因为最终返回的内容为 定义接口
//举例:
/*
Identifer(状态码对应const) | Code | HTTP Code | Description
ErrSucess(内部使用) 100001 200 OK (外部展示)
ErrSecretNotFound 110102 404 Secret not found
地址:
https://static001.geekbang.org/resource/image/b5/95/b58ff5b9455d13fc397fdf5228ea7195.png?wh=1441x1518
*/
//定义 Code 接口
type Coder interface {
// 对应HTTP的状态码
HTTPStatus() int
// err对应的状态码
Code() int
// code对应的错误描述(面向用户)
String() string
// 详情文档
Reference() string
}
type defaultCoder struct {
HTTPCode int
C int //字段名和方法名不能相同
CodeString string // code 描述
Ref string
}
// 实现 Coder 接口
func (d defaultCoder) HTTPStatus() int {
if d.HTTPCode == 0 {
return 500
}
return d.HTTPCode
}
func (d defaultCoder) Code() int {
return d.C
}
func (d defaultCoder) String() string { return d.CodeString }
func (d defaultCoder) Reference() string { return d.Ref }
// 定义Coder集合
var coders = map[int]Coder{}
var rw sync.RWMutex
//然后进行注册
func Register(c Coder) {
if c.Code() == 0 { //验证 code 是否存在
panic("code `0` is reserved by `github.com/marmotedu/errors` as unknownCode error code")
}
rw.Lock()
defer rw.Unlock()
coders[c.Code()] = c
}
// 传来接口 添加 Coder
func MustRegister(c Coder) {
//先进行判断是否含有 若有则进行panic
if c.Code() == 0 { //验证 code 是否存在
panic("code `0` is reserved by `github.com/marmotedu/errors` as unknownCode error code")
}
rw.Lock()
defer rw.Unlock()
if _, ok := coders[c.Code()]; ok {
panic(fmt.Sprintf("code: %d already exist", c.Code()))
}
coders[c.Code()] = c
}
//得到 err 对应的 Coder接口
func ParseCoder(err error) Coder {
if err == nil {
return nil
}
if v, ok := err.(*withCode); ok {
if coder, ok := coders[v.code]; ok {
return coder
}
}
return unknownCoder
}
//判断withCode是否存在
func IsCode(err error, code int) bool {
if v, ok := err.(*withCode); ok {
if v.code == code {
return true
}
if v.cause != nil {
return IsCode(v.cause, code)
}
return false
}
return false
}
func init() {
//初始化默认的code
coders[unknownCoder.Code()] = unknownCoder
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。