日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go1.18新特性:棄用strings.Title方法,換個(gè)新坑吧!

大家好,我是煎魚(yú)。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)雙城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了數(shù)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

最近在看 Go1.18 Release Notes 時(shí),發(fā)現(xiàn) strings, bytes 標(biāo)準(zhǔn)庫(kù)的 Title 方法,竟然被棄用了(Deprecated),這是為什么呢?

今天這篇文章就由煎魚(yú)和大家一起看看。

介紹

這里以 strings 標(biāo)準(zhǔn)庫(kù)為例,strings.Title 方法的作用是:將所有單詞開(kāi)頭的 Unicode 字母映射到其 Unicode 標(biāo)題大小寫(xiě)。

例子如下:

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Title("her royal highness"))
fmt.Println(strings.Title("eddy cjy"))
fmt.Println(strings.Title("хлеб"))
}

輸出結(jié)果:

Her Royal Highness
Eddy Cjy
Хлеб

這些單詞均被轉(zhuǎn)換為其大寫(xiě)。

問(wèn)題

看上去似乎一切都很美好,但其實(shí)他現(xiàn)階段有 2 個(gè)明顯的缺陷。

分別是:

  • 無(wú)法正確處理 Unicode 標(biāo)點(diǎn)符號(hào)。
  • 不考慮特定人類語(yǔ)言的大寫(xiě)規(guī)則。

接下來(lái)我們具體展開(kāi)講講。

Unicode 標(biāo)點(diǎn)符號(hào)

第一個(gè)問(wèn)題,例子如下:

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)
}
}

輸出結(jié)果:

Go.Go?go != Go.Go?Go

變量 a 轉(zhuǎn)換處理的結(jié)果是 “Go.Go?go”,但按照實(shí)際的訴求應(yīng)當(dāng)為 “Go.Go?Go”。

特定語(yǔ)言規(guī)則

第二個(gè)問(wèn)題,代碼如下:

func main() {
fmt.Println(strings.Title("ijsland"))
}

輸出結(jié)果:

Ijsland

在荷蘭語(yǔ)的單詞中,“ijsland” 應(yīng)大寫(xiě)為 “IJsland”,但結(jié)果轉(zhuǎn)換為 “Ijsland”。

解決方案

這個(gè)問(wèn)題在 2013 年就發(fā)現(xiàn)了,來(lái)源于《strings: Title function incorrectly handles word breaks[1]》,被 Go 語(yǔ)言之父 Rob Pike 標(biāo)識(shí)為計(jì)劃外的問(wèn)題。

如下圖:

由于 Go1 兼容性保障的條約,因此這是 “無(wú)法” 修復(fù)的,一旦修復(fù)就會(huì)影響函數(shù)的輸出結(jié)果,是破壞性變更。

但也可以采取別的方式,也就是本文中提到的 “棄用”。如下標(biāo)識(shí):

// 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 {

在函數(shù)上標(biāo)識(shí) “Deprecated”:

??https://pkg.go.dev ??

對(duì)應(yīng) Go 文檔會(huì)將其折疊并明確顯示棄用,建議直接使用 golang.org/x/text/cases 庫(kù)來(lái)實(shí)現(xiàn)該功能。

新的 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 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))
}
}
}

輸出結(jié)果:

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

輸出了多種語(yǔ)言的轉(zhuǎn)換,我們核心關(guān)注 cases.Lower(language.Und) 相關(guān)的代碼,該庫(kù)會(huì)通過(guò)調(diào)用:

  • cases.Title().Bytes()
  • cases.Title().String()

在編程中指定處理的語(yǔ)言,來(lái)解決不同人類語(yǔ)言的符號(hào)、不同語(yǔ)言和大寫(xiě)詞語(yǔ)的訴求,避免一刀切。

但這個(gè)新 “坑”,顯然也引入了更多的復(fù)雜性,說(shuō)好的 “l(fā)ess is more...”,使用該方法時(shí)值得考量新的成本了。

總結(jié)

雖然只有一個(gè)小小的函數(shù),但也延伸出了不少的問(wèn)題。本質(zhì)上還是在設(shè)計(jì)時(shí),存在認(rèn)知的局限性。

另外 strings.Title 和 bytes.Title 函數(shù),在實(shí)際工作中也常被誤解為就是轉(zhuǎn)換首字母大寫(xiě)的方法,與設(shè)計(jì)含義相違背。

雖然最終與缺陷相比,這樣的誤解卻帶來(lái)了更好的效果,但對(duì)于一些特殊場(chǎng)景和語(yǔ)言支持,還是有很大的問(wèn)題。

也算是塞翁失馬,焉知非福了。

參考資料

[1]strings: Title function incorrectly handles word breaks: https://github.com/golang/go/issues/6801


分享名稱:Go1.18新特性:棄用strings.Title方法,換個(gè)新坑吧!
文章網(wǎng)址:http://m.5511xx.com/article/dhjjdds.html