? Golang有一個(gè)很有意思的官方庫,叫g(shù)olang.org/x,x可能是extends,experimental,總之是一些在官方庫中沒有,但是又很有用的庫。最近花點(diǎn)時(shí)間把這里有用的介紹一下。
? text庫主要提供strings庫的一系列Unicode和國(guó)際化適配的替代升級(jí)方案。常用的庫如下:
golang.org/x/text/languagelanguage庫定義了BCP 47的語言標(biāo)簽支持,這里的語言指的自然語言,英語,中文等。
所謂的BCP 47 就是zh-CN這種格式的前面是語言,后面是地域的標(biāo)識(shí)符(地域可選)
?
language庫定義了Match等操作,這樣你可以用來匹配最佳的語言,常用的是http中,用戶在頭部通過Accept-Language標(biāo)識(shí)了他希望使用的語言,這樣我們?cè)诜?wù)端可以和服務(wù)器支持的語言進(jìn)行匹配,尋找最合適的語言。
這個(gè)庫雖然介紹的功能主要是Match功能,但同時(shí)也是cases等其他庫用于標(biāo)識(shí)語言的基礎(chǔ)庫,所以第一個(gè)介紹這個(gè)庫。當(dāng)然如果我們要做一個(gè)國(guó)際化程序,也可以把國(guó)際化標(biāo)識(shí)這塊,也使用lanuage庫作為通用標(biāo)識(shí),以增強(qiáng)兼容性和標(biāo)準(zhǔn)化。
golang.org/x/text/casescases庫用于支持國(guó)家化的大小寫轉(zhuǎn)換,寫法如下
var case = cases.Title(language.English, cases.NoLower)
fmt.Print(case.String("beforeThis")) //BeforeThis
這里的Title就是一般的Title case的用法。Title函數(shù)支持傳入附加Option,上面?zhèn)魅肓薔oLower參數(shù),用于標(biāo)識(shí)除了首字母之外,其他非小寫字母不需要轉(zhuǎn)化為小寫。
相比于標(biāo)準(zhǔn)庫,cases的具體效果還是有區(qū)別,比如 下面的測(cè)試?yán)?/p>
func TestCases(t *testing.T) {
var tested = "beforeThis"
fmt.Println("基礎(chǔ)庫Title:", strings.ToTitle(tested))
var case1 = cases.Title(language.English)
fmt.Println("不帶Option的cases Title:", case1.String(tested))
var case2 = cases.Title(language.English, cases.NoLower)
fmt.Println("帶Option的cases Title:", case2.String(tested))
}
輸出如下:
基礎(chǔ)庫Title: BEFORETHIS
不帶Option的cases Title: Beforethis
帶Option的cases Title: BeforeThis
基礎(chǔ)庫的ToTitle做完全大寫轉(zhuǎn)換還是有問題的,cases庫就正常一點(diǎn),對(duì)首字母大寫即可。
而ToLower和ToUpper表現(xiàn)一致。
而國(guó)際化方面,主要針對(duì)幾種語言做了適應(yīng)性處理,主要是西歐語言的差異,這里就不多講了,需要的同學(xué)可以從Title函數(shù)點(diǎn)進(jìn)去看代碼,有詳細(xì)的注釋
titleInfos = []struct {
title mapFunc
lower mapFunc
titleSpan spanFunc
rewrite func(*context)
}{
{title, lower, isTitle, nil}, // und
{title, lower, isTitle, afnlRewrite}, // af
{aztrUpper(title), aztrLower, isTitle, nil}, // az
{title, lower, isTitle, nil}, // el
{ltUpper(title), ltLower, noSpan, nil}, // lt
{nlTitle, lower, nlTitleSpan, afnlRewrite}, // nl
{aztrUpper(title), aztrLower, isTitle, nil}, // tr
}
golang.org/x/text/numbernumber庫主要定義了很多幫助格式化數(shù)字的幫助函數(shù),這個(gè)應(yīng)該我們用的多點(diǎn),可用的東西包括格式化函數(shù)和選項(xiàng)兩類,格式化函數(shù)包括:
Decimal | 格式化逗號(hào)分隔的整數(shù),例如1,234,567這種 |
Engineering | 類科學(xué)計(jì)數(shù)法(但指數(shù)部分最多有三位),輸出類似這樣:12.345678?×?10? |
PerMille | 直接轉(zhuǎn)成千分比數(shù)字,例如120‰ |
Percent? ? ? ? | 百分比 |
Scientific | 科學(xué)計(jì)數(shù)法,輸出類似這樣:1.2345678?×?10? |
另外,提供了多個(gè)Option來自定義輸出:
FormatWidth | 指定數(shù)字轉(zhuǎn)換后的字符串寬度,例如 number.PerMille(0.12, number.FormatWidth(10))會(huì)輸出 “? ? ? 120‰” |
IncrementString | 一種寬泛的四舍五入算法,例如 number.PerMille(0.16, number.IncrementString("0.3"))會(huì)輸出0.3,number.PerMille(0.14, number.IncrementString("0.3"))會(huì)輸出0.0 |
MaxFractionDigits | 大小數(shù)位數(shù)(四舍五入) |
MaxIntegerDigits? | 大整數(shù)位數(shù)(直接裁剪多余部分) |
MinIntegerDigits | 最小整數(shù)位數(shù)(補(bǔ)零) |
MinFractionDigits | 最小小數(shù)位數(shù)(補(bǔ)零) |
NoSeparator | 不分組數(shù)字 |
Precision | 浮點(diǎn)數(shù)精度,負(fù)數(shù)為小數(shù)位數(shù),正數(shù)為整數(shù)位數(shù) |
總的用法就是和message包配合,像fmt一樣使用,例如官方庫的案例
func TestNumber(t *testing.T) {
p := message.NewPrinter(language.Chinese)
p.Printf("%v bottles.\n", number.Decimal(3321.96, number.Precision(2)))
}
其中第二行展示了格式化函數(shù)和選項(xiàng)的用法。
這個(gè)庫我們基本可以在很多需要格式化數(shù)字的地方用到了,原來很多很復(fù)雜的自定義寫法都可以用這個(gè)來處理,這個(gè)庫還提供了從上述標(biāo)準(zhǔn)函數(shù)派生自定義的入口NewFormat,大家可以從庫中查找使用。
golang.org/x/text/message上面說了message庫提供了一個(gè)類似fmt的國(guó)際化解決方案,同時(shí)可以和number等配合,做更多的格式化以及本地化適應(yīng)的功能。
但同時(shí)他還是一個(gè)可以用于多語言翻譯的庫,在提供國(guó)際化方面有很大用處。
例如我們有這么一個(gè)幫助:
func TestNumber(t *testing.T) {
pZh := message.NewPrinter(language.Make("zh"))
pEn := message.NewPrinter(language.Make("en"))
message.SetString(language.English, "您輸入的%s不符合要求\n", "The input value %s is not legal")
pZh.Printf("您輸入的%s不符合要求\n", "1234")
pEn.Printf("您輸入的%s不符合要求\n", "1234")
}
=== RUN TestNumber
您輸入的1234不符合要求
The input value 1234 is not legal--- PASS: TestNumber (0.00s)
PASS
可以發(fā)現(xiàn),英文的Printer直接轉(zhuǎn)成了英文打印。
但是注意,這個(gè)定義必須完全一致才生效,所以官方的例子如下:
message.SetString(language.Dutch, "You have chosen to play %m.", "U heeft ervoor gekozen om %m te spelen.")
message.SetString(language.Dutch, "basketball", "basketbal")
message.SetString(language.Dutch, "hockey", "ijshockey")
message.SetString(language.Dutch, "soccer", "voetbal")
message.SetString(language.BritishEnglish, "soccer", "football")
for _, sport := range []string{"soccer", "basketball", "hockey"} {
for _, lang := range []string{"en", "en-GB", "nl"} {
p := message.NewPrinter(language.Make(lang))
fmt.Printf("%-6s %s\n", lang, p.Sprintf("You have chosen to play %m.", sport))
}
fmt.Println()
}
他首先用了一個(gè)Sprintf來把預(yù)定義國(guó)家化字符串進(jìn)行轉(zhuǎn)換,再做的Printf。
這個(gè)例子里還有一點(diǎn)說明的是,他使用了一個(gè)"%m"來說明傳入變量要取國(guó)際化值,如果改成%s則不轉(zhuǎn)換。
同時(shí),text庫提供了一個(gè)可編譯庫gotext用于在代碼中獲得所有的字符串,用于簡(jiǎn)化國(guó)際化的工作。
golang.org/x/text/encoding這個(gè)庫,估計(jì)中文環(huán)境就用的很多了,就是傳說中的編碼庫,用來做UTF-8,GBK,BIG5轉(zhuǎn)換的,而且他把編碼轉(zhuǎn)換的框架進(jìn)行了標(biāo)準(zhǔn)化,可以做不同編碼格式的轉(zhuǎn)換,這樣就不需要再去用iconv等麻煩的東西了。
例如encoding下面的簡(jiǎn)體中文庫simplifiedchinese提供了GB18030和GBK兩個(gè)編碼類,兩個(gè)類都可以使用NewEncoder或NewDecoder來初始化一個(gè)編碼器或者解碼器,例如下面的例子,打開一個(gè)utf-8的文件,并轉(zhuǎn)成gbk的:
f, err := os.Open("utftext.txt")
if err == nil {
var out *os.File
out, err = os.Create("gbk.txt")
if err == nil {
//將utf的reader轉(zhuǎn)成gbk的reader
r := simplifiedchinese.GBK.NewDecoder().Reader(f)
//進(jìn)一步讀取拷貝
io.Copy(out, r)
out.Close()
f.Close()
}
}
當(dāng)然,NewDecoder().Transform()直接按byte數(shù)組轉(zhuǎn)換也是可以的。
其他更多當(dāng)然,text下還有很多內(nèi)容,我個(gè)人覺得用處不大,就不細(xì)講了,包括
詳細(xì)的可以看官方庫介紹
總的我認(rèn)為:
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁題目:Golang.org/x庫初探2——text庫-創(chuàng)新互聯(lián)
本文URL:http://www.chinadenli.net/article4/gsioe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、App設(shè)計(jì)、服務(wù)器托管、做網(wǎng)站、自適應(yīng)網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容