新聞中心
? Golang有一個(gè)很有意思的官方庫(kù),叫g(shù)olang.org/x,x可能是extends,experimental,總之是一些在官方庫(kù)中沒有,但是又很有用的庫(kù)。最近花點(diǎn)時(shí)間把這里有用的介紹一下。
- Golang.org/x庫(kù)初探1——image庫(kù)
- Golang.org/x庫(kù)初探2——text庫(kù)
- Golang.org/x庫(kù)初探3——sync庫(kù)
? text庫(kù)主要提供strings庫(kù)的一系列Unicode和國(guó)際化適配的替代升級(jí)方案。常用的庫(kù)如下:
golang.org/x/text/languagelanguage庫(kù)定義了BCP 47的語言標(biāo)簽支持,這里的語言指的自然語言,英語,中文等。
所謂的BCP 47 就是zh-CN這種格式的前面是語言,后面是地域的標(biāo)識(shí)符(地域可選)
?
language庫(kù)定義了Match等操作,這樣你可以用來匹配最佳的語言,常用的是http中,用戶在頭部通過Accept-Language標(biāo)識(shí)了他希望使用的語言,這樣我們?cè)诜?wù)端可以和服務(wù)器支持的語言進(jìn)行匹配,尋找最合適的語言。
這個(gè)庫(kù)雖然介紹的功能主要是Match功能,但同時(shí)也是cases等其他庫(kù)用于標(biāo)識(shí)語言的基礎(chǔ)庫(kù),所以第一個(gè)介紹這個(gè)庫(kù)。當(dāng)然如果我們要做一個(gè)國(guó)際化程序,也可以把國(guó)際化標(biāo)識(shí)這塊,也使用lanuage庫(kù)作為通用標(biāo)識(shí),以增強(qiáng)兼容性和標(biāo)準(zhǔn)化。
golang.org/x/text/casescases庫(kù)用于支持國(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)庫(kù),cases的具體效果還是有區(qū)別,比如 下面的測(cè)試?yán)?/p>
func TestCases(t *testing.T) {
var tested = "beforeThis"
fmt.Println("基礎(chǔ)庫(kù)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ǔ)庫(kù)Title: BEFORETHIS
不帶Option的cases Title: Beforethis
帶Option的cases Title: BeforeThis
基礎(chǔ)庫(kù)的ToTitle做完全大寫轉(zhuǎn)換還是有問題的,cases庫(kù)就正常一點(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庫(kù)主要定義了很多幫助格式化數(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一樣使用,例如官方庫(kù)的案例
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è)庫(kù)我們基本可以在很多需要格式化數(shù)字的地方用到了,原來很多很復(fù)雜的自定義寫法都可以用這個(gè)來處理,這個(gè)庫(kù)還提供了從上述標(biāo)準(zhǔn)函數(shù)派生自定義的入口NewFormat,大家可以從庫(kù)中查找使用。
golang.org/x/text/message上面說了message庫(kù)提供了一個(gè)類似fmt的國(guó)際化解決方案,同時(shí)可以和number等配合,做更多的格式化以及本地化適應(yīng)的功能。
但同時(shí)他還是一個(gè)可以用于多語言翻譯的庫(kù),在提供國(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庫(kù)提供了一個(gè)可編譯庫(kù)gotext用于在代碼中獲得所有的字符串,用于簡(jiǎn)化國(guó)際化的工作。
golang.org/x/text/encoding這個(gè)庫(kù),估計(jì)中文環(huán)境就用的很多了,就是傳說中的編碼庫(kù),用來做UTF-8,GBK,BIG5轉(zhuǎn)換的,而且他把編碼轉(zhuǎn)換的框架進(jìn)行了標(biāo)準(zhǔn)化,可以做不同編碼格式的轉(zhuǎn)換,這樣就不需要再去用iconv等麻煩的東西了。
例如encoding下面的簡(jiǎn)體中文庫(kù)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ì)講了,包括
- currency: 貨幣支持庫(kù)
- date: 國(guó)際化日期相關(guān)庫(kù)
- search:本地化搜索支持,西文中差異較多,中文少
- secure:特殊用處下的文字有效性判斷
- runes,collate:utf-8相關(guān)庫(kù)
- unicode: unicode相關(guān)庫(kù)
- transform: 轉(zhuǎn)換庫(kù),可配合unicode下的各種定義來做特殊字符移除等功能
- 其他的功能庫(kù):feature、width
- 更多的編碼庫(kù),包括韓文、日文等
詳細(xì)的可以看官方庫(kù)介紹
總的我認(rèn)為:
- 編碼轉(zhuǎn)換可以直接用encoding庫(kù)
- 國(guó)際化用message庫(kù)
- Upper、Lower、Title等轉(zhuǎn)換看需要用cases庫(kù)或者標(biāo)準(zhǔn)strings庫(kù)
- number庫(kù)的功能很強(qiáng)大,在金融等應(yīng)用場(chǎng)景下用處多多。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享標(biāo)題:Golang.org/x庫(kù)初探2——text庫(kù)-創(chuàng)新互聯(lián)
分享URL:http://fisionsoft.com.cn/article/gsioe.html