成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.18 新特性:棄用 strings.Title 方法,換個(gè)新坑吧!

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

本文轉(zhuǎn)載自微信公眾號「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請聯(lián)系腦子進(jìn)煎魚了公眾號。

大家好,我是煎魚。

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

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

介紹

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

例子如下:

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)換為其大寫。

問題

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

分別是:

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

接下來我們具體展開講講。

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

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

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”。

特定語言規(guī)則

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

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

輸出結(jié)果:

Ijsland

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

解決方案

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

如下圖:

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

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

// 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)識 “Deprecated”:

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

對應(yīng) Go 文檔會將其折疊并明確顯示棄用,建議直接使用 golang.org/x/text/cases 庫來實(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

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

  • cases.Title(<language>).Bytes(<bytes>)
  • cases.Title(<language>).String(<string>)

在編程中指定處理的語言,來解決不同人類語言的符號、不同語言和大寫詞語的訴求,避免一刀切。

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

總結(jié)

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

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

雖然最終與缺陷相比,這樣的誤解卻帶來了更好的效果,但對于一些特殊場景和語言支持,還是有很大的問題。

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

參考資料

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


責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2022-01-26 09:02:57

GoCut方法

2022-02-11 21:01:18

GoNetip網(wǎng)絡(luò)庫

2022-01-19 08:51:00

Module工作區(qū)Go

2022-02-14 09:32:49

Go場景TryLock

2021-12-27 18:27:18

GoTryLockJava

2021-12-02 18:21:49

GoIP 包設(shè)計(jì)

2022-01-26 00:02:01

Go二進(jìn)制元信息

2021-12-28 07:20:44

泛型Go場景

2021-12-15 12:59:56

Go泛型版Beta1

2021-09-05 18:25:30

Go命令倉庫

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-03-18 18:00:00

編程語言泛型支持模糊測試

2024-01-22 00:30:00

Go編程Go 1.22

2009-08-27 16:24:48

擴(kuò)展方法C# 3.0新特性

2014-07-15 14:48:26

Java8

2024-09-11 09:30:58

IDEA工具編程

2025-02-08 11:00:33

2021-12-03 18:29:31

GoAny 泛型

2014-07-15 13:57:53

Java8

2022-05-17 08:02:55

GoTryLock模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久中文字幕 | 国产一区二区三区免费观看在线 | 国产yw851.c免费观看网站 | 91综合网| 国产精品一区二区三区四区 | 在线日韩| 日本欧美大片 | 国产91在线 | 亚洲 | 在线不卡视频 | 欧美亚洲视频在线观看 | 欧美日韩精品一区二区 | 夜夜骑综合 | 成av人电影在线 | 一区二区三区在线播放 | 中文字幕亚洲欧美 | 99精品久久久久久 | 日韩在线| 91欧美精品 | 色综合一区二区三区 | 91av视频| 精品国产精品国产偷麻豆 | 99reav| 午夜免费福利影院 | 91精品国产乱码久久久 | 国产一区二区视频在线观看 | 精品欧美一区二区中文字幕视频 | 日韩精品视频一区二区三区 | 欧美精品久久久久 | 一区二区三区免费观看 | 国产精品一区久久久久 | 国产高清一区二区三区 | 在线视频一区二区三区 | 欧美精品国产精品 | av影音 | 免费在线看黄 | 欧美a∨ | 欧美 日韩 在线播放 | 免费看黄色国产 | 日韩视频一区 | 国产精品久久国产精品99 | 国产女人与拘做受免费视频 |