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

2024-02-05

按照建议here https://www.thesaurus.com/e/grammar/when-to-capitalize-words/人名应该大写,例如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() https://github.com/golang/go/issues/48367.

他们建议使用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因为我不知道使用什么语言标签 https://pkg.go.dev/golang.org/x/text@v0.3.7/language#Tag.

我应该使用language.English or language.AmericanEnglish或其他?

到目前为止就像strings.Title()正在使用Und or English?


正如文档中提到的字符串.标题 https://pkg.go.dev/strings#Title已弃用,您应该使用cases.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)

请务必查看变换.变压器.变换 https://pkg.go.dev/golang.org/x/text/transform#Transformer.Transform and 案例.Caser https://pkg.go.dev/golang.org/x/text/cases#Caser以了解每个参数和返回值的含义以及该工具的局限性。例如:

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

关于什么language使用时,您应该意识到它们在结果上的差异,除此之外,您应该可以接受任何选择。这是来自的副本煎鱼对差异的总结 https://segmentfault.com/a/1190000041413266/en这为我清除了:

去游乐场:https://go.dev/play/p/xp59r1BkC9L 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 1.18 中 strings.Title() 已被弃用。现在该用什么?如何? 的相关文章

随机推荐

  • MySQL IN 子句是否多次执行子查询?

    给定 MySQL 中的 SQL 查询 SELECT FROM tableA WHERE tableA id IN SELECT id FROM tableB MySQL是否执行子查询SELECT id FROM tableB每行多次tabl
  • 有关 OpenCL 内核编程的教程或书籍? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我认为这个问题足够具体 只是为了说清楚 我不是在寻找参考 而是在寻找教程 我对内核编程方面特别感兴趣 市
  • 如何修复因字节计数长度不正确而损坏的序列化字符串?

    我使用 Hotaru CMS 和图像上传插件 如果我尝试将图像附加到帖子中 则会收到此错误 否则不会出现错误 unserialize function unserialize 偏移处错误 有问题的代码 错误点与 一致 Retrieve su
  • i18next 显示键而不是值

    I have translation json文件输入 locales en app name Example App In html 我有 a href In js document ready function var language
  • Castle:如何在日志拦截器中获取正确的 ILogger?

    如果您在温莎城堡中使用 LoggingFacility 如果您的类中有可选的记录器依赖项 城堡可以将记录器注入其中的 ILogger 属性 容器将自动解析与您的类关联的记录器 但是如果我想使用AOP 拦截器方法 来实现日志记录 我基本上想写
  • SQL 2005 - 多次指定列

    尝试在 SQL 2005 中运行此查询时出现以下错误 SELECT tb FROM SELECT FROM vCodesWithPEs INNER JOIN vDeriveAvailabilityFromPE ON vCodesWithPE
  • 在 ngx-toastr 中找不到模块

    我找不到答案 ERROR in node modules ngx toastr fesm5 ngx toastr js Module not found Error Can t resolve Users vasanthan Mean pr
  • 使用 JPanel 作为 JTable 单元格编辑器时获取焦点问题

    我有一个单元格编辑器 其中包含一个小按钮 可以双击该按钮来弹出编辑对话框 然后是一个可用于内联编辑值的文本字段 需要弹出窗口才能编辑其他值 仅允许编辑第一个显示在 JTable 中 当用户单击字段时 一切正常 但如果他们使用 Tab 键进入
  • 如何在散点图的 x 轴上绘制每分钟的时间

    为 1 秒采样数据设置分钟小刻度 OverflowError int too big to convert 考虑这个数据帧 采样间隔为 1 秒 持续时间约为 30 分钟 import matplotlib pyplot as plt fro
  • .jsp 中的登录系统

    我有一个login jsp包含登录表单的页面 登录后 用户将被带到index jsp和这个index jsp应该知道哪个用户已登录 如果用户刷新页面 他将保持登录状态 而不会返回到login jsp 所以需要有某种会议 UPDATE会话管理
  • SMTP 错误:无法连接到 SMTP 主机

    我有这段代码 并且在我的本地服务器上一切正常 电子邮件已发送 没有任何问题 但现在我将内容传递给网络服务器 我收到此错误 SMTP Error Could not connect to SMTP host SSL is enable in
  • 复式记账分页问题

    带有分页的复式记账会计系统存在一个非常严重的问题 我认为这很常见 但我仍然没有找到解决我的问题的任何解决方案 您可以使用此链接阅读有关简单的复式记账会计系统 https medium com RobertKhou double entry
  • 创建虚拟监视器(显示设备)

    我提出了一个问题here https stackoverflow com questions 11919175 java robot screenshot beyond visible但意识到我走错了方向 我需要创建一个虚拟监视器 实际上只
  • 如何以最便携的方式通过Graphene访问PrimeFaces组件?

    我正在使用 Primefaces 6 1 组件为 Java EE Web 客户端编写 Arquillian Graphene 功能测试 并希望从一开始就以最便携的方式编写它们 我注意到不可能执行类似的操作WebElement click在任
  • watchOS 2 与 CocoaPods 配合使用

    有人让 CocoaPods 与 watchOS 2 一起使用吗 我尝试将 use framework 与 platform watchos 2 0 一起使用 但它说 无效Podfile文件 不支持的平台watchos2 平台必须是 ios
  • 是否可以从谷歌电子表格填充谷歌表单?

    我想创建一个使用电子表格中的数据的表单 以便它是动态的 是否有可能做到这一点 我无法找到任何描述如何操作或任何示例的地方 似乎所有可能的方法都是从表单填充电子表格 我也会使用该表单 但这不是这里的主要问题 是的 使用表单脚本并使用 FORM
  • 如何升级django?

    我的项目在 Django 1 5 4 上运行 我想升级它 我做到了pip install U I django现在pip freeze显示 Django 1 6 5 显然 django 已升级 我在virtualenv 但我的项目仍在使用
  • bootstrap-selectpicker 不改变框宽度

    我正在尝试更改显示所选选项的选择器框的宽度 但无论我尝试什么 我都无法更改它 也无法更改框的颜色 任何想法或建议表示赞赏 我假设应该更改框宽度的代码片段如下 如您所见 我将其一直设置为 25 但宽度仍然很宽 selectpicker wid
  • 如果窗口未激活则获取输入 (Windows)

    简洁版本 当窗口未激活时 如何在使用 C C 的 Windows 中接收输入消息 背景资料 我目前正在开发一个不应该依赖于任何窗口的输入系统 因此它可以例如也可以在控制台中使用 我的想法是创建一个仅接收消息的不可见窗口 这可以使用 HWND
  • 在 Go 1.18 中 strings.Title() 已被弃用。现在该用什么?如何?

    按照建议here https www thesaurus com e grammar when to capitalize words 人名应该大写 例如John William Smith 我正在用 Golang 编写一个小软件 它从用户