当前位置: 首页 > 后端技术 > PHP

Go1.18新特性:弃用strings.Title方法,换个新坑!

时间:2023-03-29 14:02:04 PHP

大家好,我是炸鱼。最近看Go1.18ReleaseNotes的时候,发现stringsandbytes标准库的Title方法已经弃用(Deprecated)了。为什么?今天的文章就由炸鱼和大家一起阅读。简介这里以字符串标准库为例。strings.Title方法的作用是将所有单词开头的Unicode字母映射到它们的Unicode标题大小写。示例如下:import("fmt""strings")funcmain(){fmt.Println(strings.Title("殿下"))fmt.Println(strings.Title("eddycjy"))fmt.Println(strings.Title("хлеб"))}输出结果:HerRoyalHighnessEddyCjyХлеб这些单词被转换为大写。问题看起来一切正常,但实际上他现阶段有2个明显的缺陷。分别为:Unicode标点符号无法正确处理。不考虑特定人类语言的大写规则。接下来,我们详细说说。第一个Unicode标点问题,例子如下:import("fmt""strings")funcmain(){a:=strings.Title("go.go\u2024go")b:="Go.Go\u2024Go"ifa!=b{fmt.Printf("%s!=%s\n",a,b)}}输出结果:Go.Go?go!=Go.Go?Go变量a的转换过程结果为“Go.Go?go”,但根据实际需要,应该为“Go.Go?Go”。第二题具体语言规则,代码如下:funcmain(){fmt.Println(strings.Title("ijsland"))}输出结果:Ijsland在荷兰语中,“ijsland”要大写为“IJsland",但结果被转换为"Ijsland"。解决方案这个问题是2013年发现的,来自《strings: Title function incorrectly handles word breaks》,被Go语言之父RobPike认定为计划外问题。如下图所示:由于Go1兼容性保证协议,这是“无法”修复的。一旦修复,将影响函数的输出,属于破坏性改变。但也可以通过另一种方式来实现,就是本文所说的“弃用”。标记如下://Title返回字符串s的副本,其中包含以单词开头的所有Unicode字母//映射到它们的Unicode标题大小写。////BUG(rsc):Title用于单词边界的规则不处理Unicode标点符号正确。////Deprecated:Usegolang.org/x/text/casesinstead.funcTitle(sstring)string{Identify"Deprecated"onthefunction:相应的Go文档将折叠它并清楚地显示deprecated,它推荐直接使用golang.org/x/text/cases库来实现这个功能。新的x/text/cases如下:import("fmt""golang.org/x/text/cases""golang.org/x/text/language")funcmain(){src:=[]string{“helloworld!”,“iwithdot”,“'nijsberg”,“O'Brian来了”,}for_,c:=range[]cases.Caser{cases.Lower(language.Und)案例Println(c.String(s))}}}输出:helloworld!iwithdot'nijsbergherecomeso'brianHELLOWORLD!?W?THDOT'N?JSBERGHERECOMESO'BR?ANHelloWorld!IWithDot'nIJsbergHereComesO'brianHelloWorld!IWithDot'NIjsbergHereComesO'Brian输出多种语言的转换。我们重点关注cases.Lower(language.Und)相关的代码,会调用:cases.Title()。Bytes()cases.Title().String()指定编程中的处理语言,解决不同人类语言符号、不同语言和大写单词的诉求,避免一刀切的总结。虽然只有一个很小的功能,但是也扩展了很多问题。本质上,设计存在认知局限性。另外,strings.Title和bytes.Title函数在实际工作中经常被误解为首字母转大写的方法,有悖于设计初衷。虽然最终,这样的误解带来的结果比缺陷要好,但是在一些特殊的场景和语言支持上还是存在很大的问题。也算是因祸得福了,不知道是不是福分。如有任何问题,欢迎在评论区反馈交流。最好的关系是相互成就。您的好评是创作炸鱼最大的动力。感谢您的支持。文章持续更新中。可以微信搜索【脑补炸鱼】阅读。本文已收录在GitHubgithub.com/eddycjy/blog中。学习Go语言可以看Go学习地图和路线。欢迎星星提醒。