perf: 调整 super 包 error 部分为使用后再申请内存

This commit is contained in:
kercylan98 2023-09-09 15:26:43 +08:00
parent de7b085cf7
commit 83b28003c8
1 changed files with 30 additions and 14 deletions

View File

@ -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
}