在 Go 1.18 中,strings.Title() 已弃用。现在该用什么?如何?

正如此处建议的那样,人名应该大写John William Smith。


我正在用 Golang 编写一个小软件,它从用户的表单输入中获取姓氏和名字。


在 Go 1.18 之前,我一直在使用:


lastname = strings.Title(strings.ToLower(strings.TrimSpace(lastname)))

firstname = strings.Title(strings.ToLower(strings.TrimSpace(firstname)))

它有效,但现在 Go 1.18已弃用strings.Title()。


他们建议golang.org/x/text/cases改用。


所以我想我应该像这样更改我的代码:


caser := cases.Title(language.Und)


lastname = caser.Title(strings.ToLower(strings.TrimSpace(lastname)))

firstname = caser.Title(strings.ToLower(strings.TrimSpace(firstname)))

它的工作原理和以前一样。


区别在于像ijsland这样的荷兰语单词应该标题为 asIJsland而不是Ijsland。


问题

在caser := cases.Title(language.Und)我使用的行中,Und因为我不知道要使用什么语言标签。


我应该使用language.Englishorlanguage.AmericanEnglish或 other 吗?


到目前为止,就像strings.Title()是在使用Und或English?


慕丝7291255
浏览 272回答 4
4回答

千万里不及你

如文档strings.Title中所述,已弃用,您应该cases.Title改用。弃用:Title 用于单词边界的规则不能正确处理 Unicode 标点符号。请改用 golang.org/x/text/cases。以下是如何从两个角度使用它的示例代码:// Straightforward approachcaser := cases.Title(language.BrazilianPortuguese)titleStr := caser.String(str)// Transformer interface aware approachsrc := []byte(s)dest := []byte(s) // dest can also be `dest := src`caser := cases.Title(language.BrazilianPortuguese)_, _, err := caser.Transform(dest, src, true)请务必查看transform.Transformer.Transform和cases.Caser以了解每个参数和返回值的含义,以及该工具的局限性。例如:Caser 可能是有状态的,因此不应在 goroutine 之间共享。关于language使用什么,您应该知道它们在结果上的差异,除此之外,您应该可以随意选择。这是煎鱼的一份关于为我清除它的差异的总结:去游乐场:https ://go.dev/play/p/xp59r1BkC9Lfunc main() {    src := []string{        "hello world!",        "i with dot",        "'n ijsberg",        "here comes O'Brian",    }    for _, c := range []cases.Caser{        cases.Lower(language.Und),        cases.Upper(language.Turkish),        cases.Title(language.Dutch),        cases.Title(language.Und, cases.NoLower),    } {        fmt.Println()        for _, s := range src {            fmt.Println(c.String(s))        }    }}输出如下hello world!i with dot'n ijsberghere comes o'brianHELLO WORLD!İ WİTH DOT'N İJSBERGHERE COMES O'BRİANHello World!I With Dot'n IJsbergHere Comes O'brianHello World!I With Dot'N IjsbergHere Comes O'Brian

浮云间

到目前为止,就像strings.Title()是在使用Und或English?strings.Title()基于 ASCII工作,cases.Title()基于 Unicode 工作,没有办法获得完全相同的行为。我应该使用 language.English 还是 language.AmericanEnglish 还是其他语言?language.English,language.AmericanEnglish而且language.Und似乎都有相同的Title规则。使用它们中的任何一个都应该让您最接近strings.Title()您将要获得的原始行为。使用这个支持 Unicode 的包的全部意义在于它客观上更正确。因此,请选择适合您用户的标签。

哆啦的时光机

strings.Title(str)已弃用,应更改为cases.Title(language.Und, cases.NoLower).String(str)package mainimport (    "fmt"    "strings"    "golang.org/x/text/cases"    "golang.org/x/text/language")func main() {    fmt.Println(strings.Title("abcABC"))                                   // AbcABC    fmt.Println(cases.Title(language.Und, cases.NoLower).String("abcABC")) // AbcABC}游乐场:https ://go.dev/play/p/i0Eqh3QfxTx

三国纷争

下面是一个简单的示例,说明如何使用 golang.org/x/text 包将变量中每个字符串值的首字母大写。package mainimport (    "fmt"    "golang.org/x/text/cases"    "golang.org/x/text/language")func main() {    sampleStr := "with value lower,  all the letters are lowercase. this is good for poetry perhaps"    caser := cases.Title(language.English)    fmt.Println(caser.String(sampleStr))}输出:值较低时,所有字母均为小写。也许这对诗歌有好处游乐场示例:https ://go.dev/play/p/_J8nGVuhYC9
打开App,查看更多内容
随时随地看视频慕课网APP