From 83b28003c85f0caa87f5d48697bef7f3072ee58a Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sat, 9 Sep 2023 15:26:43 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=B0=83=E6=95=B4=20super=20=E5=8C=85?= =?UTF-8?q?=20error=20=E9=83=A8=E5=88=86=E4=B8=BA=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=90=8E=E5=86=8D=E7=94=B3=E8=AF=B7=E5=86=85=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/super/error.go | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/utils/super/error.go b/utils/super/error.go index 9d1b2b8..4cfb1d7 100644 --- a/utils/super/error.go +++ b/utils/super/error.go @@ -5,19 +5,20 @@ import ( "sync" ) -var errorMapper = make(map[error]int) -var errorMapperRef = make(map[error]error) -var mutex sync.Mutex +var errorManagerInstance *errorManager // RegError 通过错误码注册错误,返回错误的引用 func RegError(code int, message string) error { if code == 0 { return errors.New("error code can not be 0") } - mutex.Lock() - defer mutex.Unlock() + errorManagerInstance.mutex.Lock() + defer errorManagerInstance.mutex.Unlock() + if errorManagerInstance == nil { + errorManagerInstance = new(errorManager).init() + } err := &ser{code: code, message: message} - errorMapper[err] = code + errorManagerInstance.errorMapper[err] = code return err } @@ -27,11 +28,14 @@ func RegErrorRef(code int, message string, ref error) error { if code == 0 { return errors.New("error code can not be 0") } - mutex.Lock() - defer mutex.Unlock() + errorManagerInstance.mutex.Lock() + defer errorManagerInstance.mutex.Unlock() + if errorManagerInstance == nil { + errorManagerInstance = new(errorManager).init() + } err := &ser{code: code, message: message} - errorMapper[err] = code - errorMapperRef[ref] = err + errorManagerInstance.errorMapper[err] = code + errorManagerInstance.errorMapperRef[ref] = err return ref } @@ -41,9 +45,9 @@ func GetError(err error) (int, error) { if unw == nil { unw = err } - mutex.Lock() - defer mutex.Unlock() - if ref, exist := errorMapperRef[unw]; exist { + errorManagerInstance.mutex.Lock() + defer errorManagerInstance.mutex.Unlock() + if ref, exist := errorManagerInstance.errorMapperRef[unw]; exist { //err = fmt.Errorf("%w : %s", ref, err.Error()) err = ref } @@ -51,7 +55,7 @@ func GetError(err error) (int, error) { if unw == nil { unw = err } - code, exist := errorMapper[unw] + code, exist := errorManagerInstance.errorMapper[unw] if !exist { return 0, errors.New("error not found") } @@ -66,3 +70,15 @@ type ser struct { func (slf *ser) Error() string { 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 +}