在Go语言1.18中,strings.title()被弃用了,现在该用什么?怎么用?

3phpmpom  于 2022-12-07  发布在  Go
关注(0)|答案(4)|浏览(348)

建议here人名应大写,如John William Smith
我正在用Golang写一个小软件,它从用户的表单输入中获取姓和名。
在Go 1.18之前,我使用的是:

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

它的工作,但现在去1.18 has deprecated 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这样的荷兰语单词应该命名为IJsland,而不是Ijsland

问题

caser := cases.Title(language.Und)行中,我使用Und,因为我不知道要使用什么语言的Tag。
我应该使用language.Englishlanguage.AmericanEnglish还是其他?
到目前为止,它是像strings.Title()使用UndEnglish

o4tp2gmn

o4tp2gmn1#

如文档strings.Title中所述,不推荐使用,应改用cases.Title
已弃用:标题用于单词边界的规则无法正确处理Unicode标点符号。请改用golang.org/x/text/cases。
下面是一个示例代码,说明如何从两个Angular 使用它:

// Straightforward approach
caser := cases.Title(language.BrazilianPortuguese)
titleStr := caser.String(str)

// Transformer interface aware approach
src := []byte(s)
dest := []byte(s) // dest can also be `dest := src`
caser := cases.Title(language.BrazilianPortuguese)
_, _, err := caser.Transform(dest, src, true)

确保查看transform.Transformer和cases.Caser,以便了解每个参数和返回值的含义,以及工具的限制。例如:
一个Caser可能是有状态的,因此不应该在goroutine之间共享。
关于使用什么language,你应该知道它们在结果上的差异,除此之外,你应该可以接受任何选择。下面是一个来自煎鱼's summary on the differences的副本,它为我清除了它:
GoPlayground:https://go.dev/play/p/xp59r1BkC9L

func 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 ijsberg
here comes o'brian

HELLO WORLD!
İ WİTH DOT
'N İJSBERG
HERE COMES O'BRİAN

Hello World!
I With Dot
'n IJsberg
Here Comes O'brian

Hello World!
I With Dot
'N Ijsberg
Here Comes O'Brian
lrl1mhuk

lrl1mhuk2#

到目前为止,它是像strings.Title()使用UndEnglish
strings.Title()工作于based on ASCII,而cases.Title()基于Unicode工作,因此无法获得完全相同的行为。
我应该用英语还是美语?
language.Englishlanguage.AmericanEnglishlanguage.Und看起来都有same Title rules。使用其中任何一个都可以让你最接近原始的strings.Title()行为。
使用这个支持Unicode的包的全部意义在于它在客观上更正确。所以选择一个适合你的用户的标记。

ttisahbt

ttisahbt3#

strings.Title(str)已过时,应更改为cases.Title(language.Und, cases.NoLower).String(str)

package main
import (
    "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
}

Playground:https://go.dev/play/p/i0Eqh3QfxTx

qyzbxkaa

qyzbxkaa4#

下面是一个简单的示例,说明如何使用www.example.com包将变量中每个字符串值的首字母大写golang.org/x/text。

package main

import (
    "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))
}

输出:值越小,所有字母都是小写。这可能对诗歌有好处
Playground示例:https://go.dev/play/p/_J8nGVuhYC9

相关问题