perf: 调整 super 包 error 部分为使用后再申请内存
This commit is contained in:
parent
de7b085cf7
commit
83b28003c8
|
@ -5,19 +5,20 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errorMapper = make(map[error]int)
|
var errorManagerInstance *errorManager
|
||||||
var errorMapperRef = make(map[error]error)
|
|
||||||
var mutex sync.Mutex
|
|
||||||
|
|
||||||
// RegError 通过错误码注册错误,返回错误的引用
|
// RegError 通过错误码注册错误,返回错误的引用
|
||||||
func RegError(code int, message string) error {
|
func RegError(code int, message string) error {
|
||||||
if code == 0 {
|
if code == 0 {
|
||||||
return errors.New("error code can not be 0")
|
return errors.New("error code can not be 0")
|
||||||
}
|
}
|
||||||
mutex.Lock()
|
errorManagerInstance.mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer errorManagerInstance.mutex.Unlock()
|
||||||
|
if errorManagerInstance == nil {
|
||||||
|
errorManagerInstance = new(errorManager).init()
|
||||||
|
}
|
||||||
err := &ser{code: code, message: message}
|
err := &ser{code: code, message: message}
|
||||||
errorMapper[err] = code
|
errorManagerInstance.errorMapper[err] = code
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,11 +28,14 @@ func RegErrorRef(code int, message string, ref error) error {
|
||||||
if code == 0 {
|
if code == 0 {
|
||||||
return errors.New("error code can not be 0")
|
return errors.New("error code can not be 0")
|
||||||
}
|
}
|
||||||
mutex.Lock()
|
errorManagerInstance.mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer errorManagerInstance.mutex.Unlock()
|
||||||
|
if errorManagerInstance == nil {
|
||||||
|
errorManagerInstance = new(errorManager).init()
|
||||||
|
}
|
||||||
err := &ser{code: code, message: message}
|
err := &ser{code: code, message: message}
|
||||||
errorMapper[err] = code
|
errorManagerInstance.errorMapper[err] = code
|
||||||
errorMapperRef[ref] = err
|
errorManagerInstance.errorMapperRef[ref] = err
|
||||||
return ref
|
return ref
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,9 +45,9 @@ func GetError(err error) (int, error) {
|
||||||
if unw == nil {
|
if unw == nil {
|
||||||
unw = err
|
unw = err
|
||||||
}
|
}
|
||||||
mutex.Lock()
|
errorManagerInstance.mutex.Lock()
|
||||||
defer mutex.Unlock()
|
defer errorManagerInstance.mutex.Unlock()
|
||||||
if ref, exist := errorMapperRef[unw]; exist {
|
if ref, exist := errorManagerInstance.errorMapperRef[unw]; exist {
|
||||||
//err = fmt.Errorf("%w : %s", ref, err.Error())
|
//err = fmt.Errorf("%w : %s", ref, err.Error())
|
||||||
err = ref
|
err = ref
|
||||||
}
|
}
|
||||||
|
@ -51,7 +55,7 @@ func GetError(err error) (int, error) {
|
||||||
if unw == nil {
|
if unw == nil {
|
||||||
unw = err
|
unw = err
|
||||||
}
|
}
|
||||||
code, exist := errorMapper[unw]
|
code, exist := errorManagerInstance.errorMapper[unw]
|
||||||
if !exist {
|
if !exist {
|
||||||
return 0, errors.New("error not found")
|
return 0, errors.New("error not found")
|
||||||
}
|
}
|
||||||
|
@ -66,3 +70,15 @@ type ser struct {
|
||||||
func (slf *ser) Error() string {
|
func (slf *ser) Error() string {
|
||||||
return slf.message
|
return slf.message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type errorManager struct {
|
||||||
|
errorMapper map[error]int
|
||||||
|
errorMapperRef map[error]error
|
||||||
|
mutex sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *errorManager) init() *errorManager {
|
||||||
|
slf.errorMapper = make(map[error]int)
|
||||||
|
slf.errorMapperRef = make(map[error]error)
|
||||||
|
return slf
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue