From ef1e967bbc16898ebd7bd4dab074db7a9a9b83e3 Mon Sep 17 00:00:00 2001 From: payon-sdk <116708421+payon-sdk@users.noreply.github.com> Date: Tue, 15 Nov 2022 11:20:47 +0700 Subject: [PATCH 1/2] Update translator.go Fix fatal error: concurrent map read and map write --- translator.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/translator.go b/translator.go index 24b18db..fc4aa48 100644 --- a/translator.go +++ b/translator.go @@ -96,8 +96,12 @@ func newTranslator(trans locales.Translator) Translator { // {#} is the only replacement type accepted and are ad infinitum // eg. one: '{0} day left' other: '{0} days left' func (t *translator) Add(key interface{}, text string, override bool) error { - - if _, ok := t.translations[key]; ok && !override { + var mutex = sync.Mutex{} + //fatal error: concurrent map read and map write + mutex.Lock() + _, okGet := t.translations[key] + mutex.Unlock() + if okGet && !override { return &ErrConflictingTranslation{locale: t.Locale(), key: key, text: text} } @@ -124,8 +128,10 @@ func (t *translator) Add(key interface{}, text string, override bool) error { trans.indexes = append(trans.indexes, idx) trans.indexes = append(trans.indexes, idx+len(s)) } - + //fatal error: concurrent map read and map write + mutex.Lock() t.translations[key] = trans + mutex.Unlock() return nil } From 8038888fd0423a08b51f730149856a6121790f43 Mon Sep 17 00:00:00 2001 From: payon-sdk <116708421+payon-sdk@users.noreply.github.com> Date: Wed, 16 Nov 2022 09:58:53 +0700 Subject: [PATCH 2/2] Update translator.go import lib "sync" --- translator.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/translator.go b/translator.go index fc4aa48..93cbd73 100644 --- a/translator.go +++ b/translator.go @@ -4,7 +4,7 @@ import ( "fmt" "strconv" "strings" - + "sync" "github.com/go-playground/locales" ) @@ -70,6 +70,7 @@ var _ Translator = new(translator) var _ locales.Translator = new(translator) type translator struct { + sync.RWMutex locales.Translator translations map[interface{}]*transText cardinalTanslations map[interface{}][]*transText // array index is mapped to locales.PluralRule index + the locales.PluralRuleUnknown @@ -77,6 +78,20 @@ type translator struct { rangeTanslations map[interface{}][]*transText } +func (sn *translator) SetTranslations(key interface{}, val *transText) { + sn.Lock() + defer sn.Unlock() + sn.translations[key] = val +} +func (sn *translator) GetTranslations(key interface{}) (*transText, bool) { + sn.Lock() + defer sn.Unlock() + if val, ok := sn.translations[key]; ok { + return val, true + } + return nil, false +} + type transText struct { text string indexes []int @@ -96,12 +111,8 @@ func newTranslator(trans locales.Translator) Translator { // {#} is the only replacement type accepted and are ad infinitum // eg. one: '{0} day left' other: '{0} days left' func (t *translator) Add(key interface{}, text string, override bool) error { - var mutex = sync.Mutex{} - //fatal error: concurrent map read and map write - mutex.Lock() - _, okGet := t.translations[key] - mutex.Unlock() - if okGet && !override { + + if _, ok := t.GetTranslations(key); ok && !override { return &ErrConflictingTranslation{locale: t.Locale(), key: key, text: text} } @@ -129,9 +140,7 @@ func (t *translator) Add(key interface{}, text string, override bool) error { trans.indexes = append(trans.indexes, idx+len(s)) } //fatal error: concurrent map read and map write - mutex.Lock() - t.translations[key] = trans - mutex.Unlock() + t.SetTranslations(key, trans) return nil }