Fix `cases.Title` crash for concurrency (#23885)

Regression of #19676 and #21814

Fix #23872

`cases.Title` is not thread-safe, it has internal state, so it can't be
used as a global shared variable.
pull/19808/merge
wxiaoguang 2 years ago committed by GitHub
parent cb6ed84c4b
commit 5fc9929da7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 13
      modules/util/util.go

@ -186,19 +186,16 @@ func ToUpperASCII(s string) string {
return string(b) return string(b)
} }
var (
titleCaser = cases.Title(language.English)
titleCaserNoLower = cases.Title(language.English, cases.NoLower)
)
// ToTitleCase returns s with all english words capitalized // ToTitleCase returns s with all english words capitalized
func ToTitleCase(s string) string { func ToTitleCase(s string) string {
return titleCaser.String(s) // `cases.Title` is not thread-safe, do not use global shared variable for it
return cases.Title(language.English).String(s)
} }
// ToTitleCaseNoLower returns s with all english words capitalized without lowercasing // ToTitleCaseNoLower returns s with all english words capitalized without lower-casing
func ToTitleCaseNoLower(s string) string { func ToTitleCaseNoLower(s string) string {
return titleCaserNoLower.String(s) // `cases.Title` is not thread-safe, do not use global shared variable for it
return cases.Title(language.English, cases.NoLower).String(s)
} }
func logError(msg string, args ...any) { func logError(msg string, args ...any) {

Loading…
Cancel
Save