为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕丝7291255 2022-11-23 20:11:01
正如此处建议的那样,人名应该大写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?
查看完整描述

4 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

如文档strings.Title中所述,已弃用,您应该cases.Title改用。


弃用:Title 用于单词边界的规则不能正确处理 Unicode 标点符号。请改用 golang.org/x/text/cases。


以下是如何从两个角度使用它的示例代码:


// 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.Transform和cases.Caser以了解每个参数和返回值的含义,以及该工具的局限性。例如:


Caser 可能是有状态的,因此不应在 goroutine 之间共享。


关于language使用什么,您应该知道它们在结果上的差异,除此之外,您应该可以随意选择。这是煎鱼的一份关于为我清除它的差异的总结:


去游乐场: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


查看完整回答
反对 回复 2022-11-23
?
浮云间

TA贡献1829条经验 获得超3个赞

到目前为止,就像strings.Title()是在使用UndEnglish

strings.Title()基于 ASCII工作,cases.Title()基于 Unicode 工作,没有办法获得完全相同的行为。

我应该使用 language.English 还是 language.AmericanEnglish 还是其他语言?

language.Englishlanguage.AmericanEnglish而且language.Und似乎都有相同的Title规则。使用它们中的任何一个都应该让您最接近strings.Title()您将要获得的原始行为。

使用这个支持 Unicode 的包的全部意义在于它客观上更正确。因此,请选择适合您用户的标签。


查看完整回答
反对 回复 2022-11-23
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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

}

游乐场:https ://go.dev/play/p/i0Eqh3QfxTx


查看完整回答
反对 回复 2022-11-23
?
三国纷争

TA贡献1804条经验 获得超7个赞

下面是一个简单的示例,说明如何使用 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))

}

输出:值较低时,所有字母均为小写。也许这对诗歌有好处


游乐场示例:https ://go.dev/play/p/_J8nGVuhYC9


查看完整回答
反对 回复 2022-11-23
  • 4 回答
  • 0 关注
  • 266 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信