您现在的位置是:亿华云 > IT科技
Go1.18 新特性:弃用 strings.Title 方法,换个新坑吧!
亿华云2025-10-04 00:53:10【IT科技】9人已围观
简介本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼。转载本文请联系脑子进煎鱼了公众号。大家好,我是煎鱼。最近在看 Go1.18 Release Notes 时,发现 strings, bytes 标准库
本文转载自微信公众号「脑子进煎鱼了」,新特性弃作者陈煎鱼。方法换转载本文请联系脑子进煎鱼了公众号。个新
大家好,新特性弃我是方法换煎鱼。
最近在看 Go1.18 Release Notes 时,个新发现 strings,新特性弃 bytes 标准库的 Title 方法,竟然被弃用了(Deprecated),方法换这是个新为什么呢?
今天这篇文章就由煎鱼和大家一起看看。
介绍
这里以 strings 标准库为例,新特性弃strings.Title 方法的方法换作用是:将所有单词开头的 Unicode 字母映射到其 Unicode 标题大小写。
例子如下:
import (
"fmt"
"strings"
)
func main() {
fmt.Println(strings.Title("her royal highness"))
fmt.Println(strings.Title("eddy cjy"))
fmt.Println(strings.Title("хлеб"))
}
输出结果:
Her Royal Highness
Eddy Cjy
Хлеб
这些单词均被转换为其大写。个新
问题
看上去似乎一切都很美好,新特性弃但其实他现阶段有 2 个明显的方法换缺陷。
分别是个新:
无法正确处理 Unicode 标点符号。不考虑特定人类语言的大写规则。接下来我们具体展开讲讲。
Unicode 标点符号
第一个问题,例子如下:
import (
"fmt"
"strings"
)
func main() {
a := strings.Title("go.go\u2024go")
b := "Go.Go\u2024Go"
if a != b {
fmt.Printf("%s != %s\n", a, b)
}
}
输出结果:
Go.Go․go != Go.Go․Go
变量 a 转换处理的结果是 “Go.Go․go”,但按照实际的诉求应当为 “Go.Go․Go”。
特定语言规则
第二个问题,代码如下:
func main() {
fmt.Println(strings.Title("ijsland"))
}
输出结果:
Ijsland
在荷兰语的云服务器提供商单词中,“ijsland” 应大写为 “IJsland”,但结果转换为 “Ijsland”。
解决方案
这个问题在 2013 年就发现了,来源于《strings: Title function incorrectly handles word breaks[1]》,被 Go 语言之父 Rob Pike 标识为计划外的问题。
如下图:
由于 Go1 兼容性保障的条约,因此这是 “无法” 修复的,一旦修复就会影响函数的输出结果,是破坏性变更。
但也可以采取别的方式,也就是本文中提到的 “弃用”。如下标识:
// Title returns a copy of the string s with all Unicode letters that begin words
// mapped to their Unicode title case.
//
// BUG(rsc): The rule Title uses for word boundaries does not handle Unicode punctuation properly.
//
// Deprecated: Use golang.org/x/text/cases instead.
func Title(s string) string {
在函数上标识 “Deprecated”:
https://pkg.go.dev
对应 Go 文档会将其折叠并明确显示弃用,建议直接使用 golang.org/x/text/cases 库来实现该功能。
新的 x/text/cases 案例如下:
import (
"fmt"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
func main() {
src := []string{
"hello world!",
"i with dot",
"n ijsberg",
"here comes OBrian",
}
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 obrian
HELLO WORLD!
İ WİTH DOT
N İJSBERG
HERE COMES OBRİAN
Hello World!
I With Dot
n IJsberg
Here Comes Obrian
Hello World!
I With Dot
N Ijsberg
Here Comes OBrian
输出了多种语言的转换,我们核心关注 cases.Lower(language.Und) 相关的代码,该库会通过调用:
cases.Title(<language>).Bytes(<bytes>) cases.Title(<language>).String(<string>)在编程中指定处理的语言,来解决不同人类语言的符号、不同语言和大写词语的源码库诉求,避免一刀切。
但这个新 “坑”,显然也引入了更多的复杂性,说好的 “less is more...”,使用该方法时值得考量新的成本了。
总结
虽然只有一个小小的函数,但也延伸出了不少的问题。本质上还是在设计时,存在认知的局限性。
另外 strings.Title 和 bytes.Title 函数,在实际工作中也常被误解为就是转换首字母大写的方法,与设计含义相违背。
虽然最终与缺陷相比,这样的误解却带来了更好的效果,但对于一些特殊场景和语言支持,还是有很大的问题。
也算是塞翁失马,焉知非福了。云南idc服务商
参考资料
[1]strings: Title function incorrectly handles word breaks: https://github.com/golang/go/issues/6801
很赞哦!(9)
相关文章
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 四、长串数字域名
- 旧域名的外链是否会对新建站点产生影响?
- 顶级域名可以增加企业品牌的价值。随着经济的快速发展,域名已不再是企业在网络中的独立地位。顶级域名的服务范围、企业产品、综合形象体现等,对于企业单位来说,顶级域名的重要性不言而喻。
- 在众多公司中,如果我们必须选择一家可信的公司,那当然是信得过的。
- 旧域名的外链是否会对新建站点产生影响?
- 2016年1月1日:注册价格将降至每年7欧元。
- 公司在注册域名时还需要确保邮箱的安全性。如果邮箱不安全,它只会受到攻击。攻击者可以直接在邮箱中重置密码并攻击用户。因此,有必要注意邮箱的安全性。
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
热门文章
站长推荐
四、一定要仔细阅读细节
投资各类域名就像到处打游击战,结果处处失败。因为这样,对任何一个中国域名市场的走势和价格都没有准确的把握,所以最好缩小范围,准确把握战场态势,埋伏。
5、企业注册国内域名需要证件,其它情况一律不需要证件。
个人域名转为公司需要什么条件?个人域名转为公司该怎么做?
用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。
什么是im域名?新手需要了解im域名哪些?
小白注册网站域名该怎么办?有什么步骤?
Status、Creation Date、Expiration Date