目的:有时候我们error 想带一些额外的信息,例如code码等
package errno

var OK     = &Errno{Code: 0, Message: "success"}
type Errno struct {
	Code    int32
	Message string
}
func (c *Errno) Error() string { // 实现接口
	return c.Message
}


func NewErr(code int32,Message string ) error {
	return &Errno{
		Code:code,
		Message:Message,
	}
}

func DecodeErr(err error) (int32, string) {
	if err == nil {
		return OK.Code, OK.Message
	}

	switch typed := err.(type) {
	case *Errno:
		return typed.Code, typed.Message
	default:
		return 1001, err.Error()
	}

}

使用如下

package main

import (
	"log"
	"my_error/errno"
)

func main()  {
	err := errno.NewErr(1000,"失败了")
	code,msg := errno.DecodeErr(err)
	log.Println(code,msg)
}

输出:
2022/05/07 13:26:08 1000 失败了