最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Golang.org/x庫(kù)初探2——text庫(kù)-創(chuàng)新互聯(lián)

? Golang有一個(gè)很有意思的官方庫(kù),叫g(shù)olang.org/x,x可能是extends,experimental,總之是一些在官方庫(kù)中沒有,但是又很有用的庫(kù)。最近花點(diǎn)時(shí)間把這里有用的介紹一下。

專業(yè)領(lǐng)域包括成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、商城建設(shè)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
  1. Golang.org/x庫(kù)初探1——image庫(kù)
  2. Golang.org/x庫(kù)初探2——text庫(kù)
  3. Golang.org/x庫(kù)初探3——sync庫(kù)

? text庫(kù)主要提供strings庫(kù)的一系列Unicode和國(guó)際化適配的替代升級(jí)方案。常用的庫(kù)如下:

golang.org/x/text/language

language庫(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/cases

cases庫(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/number

number庫(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ì)講了,包括

  1. currency: 貨幣支持庫(kù)
  2. date: 國(guó)際化日期相關(guān)庫(kù)
  3. search:本地化搜索支持,西文中差異較多,中文少
  4. secure:特殊用處下的文字有效性判斷
  5. runes,collate:utf-8相關(guān)庫(kù)
  6. unicode: unicode相關(guān)庫(kù)
  7. transform: 轉(zhuǎn)換庫(kù),可配合unicode下的各種定義來做特殊字符移除等功能
  8. 其他的功能庫(kù):feature、width
  9. 更多的編碼庫(kù),包括韓文、日文等

詳細(xì)的可以看官方庫(kù)介紹

總的我認(rèn)為:

  1. 編碼轉(zhuǎn)換可以直接用encoding庫(kù)
  2. 國(guó)際化用message庫(kù)
  3. Upper、Lower、Title等轉(zhuǎn)換看需要用cases庫(kù)或者標(biāo)準(zhǔn)strings庫(kù)
  4. 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