摘要:當(dāng)然,如果我們要統(tǒng)計(jì)下的字符長(zhǎng)度,其實(shí)我們要對(duì)其進(jìn)行轉(zhuǎn)換,在此介紹兩個(gè)函數(shù)通過這兩個(gè)函數(shù),咱們可以獲取中文字符下的具體的字符個(gè)數(shù)了。
在上面的文章中,老貓和大家分享了GO語(yǔ)言中比較重要的兩種數(shù)據(jù)結(jié)構(gòu),一種是數(shù)組,另外一種是基于數(shù)組的slice。本篇文章想要繼續(xù)和大家分享剩下的容器以及字符字符串的處理。
在Java語(yǔ)言中其實(shí)還有一個(gè)鍵值對(duì)的容器,叫做Map,當(dāng)然在我們GO語(yǔ)言中也有這種數(shù)據(jù)結(jié)構(gòu),例如,下面咱們就來看一下GO語(yǔ)言中Map的寫法以及用法。看下一Map的語(yǔ)法定義,如下例子:
m :=map[string]string { "name":"ktdaddy", "age":"28", "job":"softEngineer",}
關(guān)于語(yǔ)法的定義其實(shí)也是比較簡(jiǎn)單的,方括號(hào)里面的表示key值,后面的那個(gè)類型表示value的類型。上面老貓其實(shí)定義了一個(gè)map,并且給它初始化了一些數(shù)據(jù)。定義一個(gè)空的map其實(shí)也是比較簡(jiǎn)單的,主要有下面兩種方式
m1 :=make(map[string]int) //采用make函數(shù)直接創(chuàng)建一個(gè)map,比較常用var m2 map[string] int //用var函數(shù)申明的方式創(chuàng)建map
說實(shí)在的語(yǔ)法這種東西也沒法說出什么所以然來,大家既然想要學(xué)習(xí)這個(gè)語(yǔ)言就要去記下它的規(guī)則,所以還是得多寫多練,長(zhǎng)時(shí)間不去用可能就忘記了。
總結(jié)一下其定義形式map[k]V,當(dāng)然咱們也可以定義它比較復(fù)雜一些的數(shù)據(jù)結(jié)構(gòu),例如map里面套map,這種復(fù)合型的,那么定義的最終形式就是map[K1]map[K2]V。
這樣我們就可以獲取所有的數(shù)據(jù),當(dāng)然我們也可以根據(jù)對(duì)應(yīng)的Key值獲取相關(guān)的value
name :=m["name"]
但是很多時(shí)候,我們是不能知道這個(gè)key是否存在的,我們?nèi)≈档臅r(shí)候就要先判斷當(dāng)前的key是否存在,然后再去獲取值,其實(shí)我們可以這樣寫
name,ok :=m["name"]fmt.Println(name,ok) //結(jié)果輸出ktdaddy true
很顯然,我們可以通過ok的值去判斷當(dāng)前的key是否存在,然后再去獲取其中的value值。那么結(jié)合前面所講的if條件語(yǔ)句,咱們就可以寫出這樣的邏輯
if name,ok :=m["name"];ok { fmt.Println(name)}else { fmt.Println("key does not exist")}
刪除元素其實(shí)是相當(dāng)簡(jiǎn)單的,用內(nèi)置函數(shù)delete函數(shù)即可。我們還是承接上面的邏輯,如果發(fā)現(xiàn)存在這個(gè)Key值,那么我們就從map中進(jìn)行移除。具體如下
if name,ok :=m["name"];ok { delete(m,"name") name,ok = m["name"] fmt.Println(name,ok) }else { fmt.Println("key does not exist")}
上述刪除之后咱們重新賦值map,這樣這個(gè)代碼最終輸出的結(jié)果就是false。大家可以實(shí)際動(dòng)手練習(xí)一下。
老貓想過好幾次,如何寫這個(gè)字符串,想要將其多帶帶抽出來說感覺也不合適,因?yàn)樵蹅兒芏鄷r(shí)候會(huì)遍歷容器中的字符,因此索性就將其合并在內(nèi)建容器里面一起分享好了。這里主要想和大家分享的是rune這個(gè)內(nèi)建類型,從前面的章節(jié)中我們都知道這個(gè)相當(dāng)于是Go的char,那么這個(gè)又怎么來用呢?咱們先來看下面例子
s:= "hello我愛GO開發(fā)"fmt.Println(len(s))
大家覺得這個(gè)應(yīng)該會(huì)輸出多少呢?試著運(yùn)行一下,答案是19,那么為什么呢?我們?cè)俳又D(zhuǎn)換成字節(jié)輸出一下
s:= "hello我愛GO開發(fā)"fmt.Println(s)fmt.Println(len(s))fmt.Printf("%X/n",[]byte(s))
這樣呢,我們就獲取一段16進(jìn)制的字節(jié),結(jié)果如下
68656C6C6FE68891E788B1474FE5BC80E58F91
很顯然,我們還是無法看出來,我們將其格式做一下分割調(diào)整來看一下
s:= "hello我愛GO開發(fā)"fmt.Println(s)fmt.Println(len(s))fmt.Printf("%X/n",[]byte(s))for _,b:=range []byte(s) { fmt.Printf("%X ",b)}
運(yùn)行的結(jié)果為 :68 65 6C 6C 6F E6 88 91 E7 88 B1 47 4F E5 BC 80 E5 8F 91
數(shù)一下成對(duì)出現(xiàn)的16進(jìn)制數(shù),咱們就可以發(fā)現(xiàn)19個(gè)字節(jié)長(zhǎng)度原來是這么來的。通過分析我們不難發(fā)現(xiàn)一個(gè)英文占用了兩個(gè)字節(jié)而中文則占用了3個(gè)字節(jié),例如里面的“我”轉(zhuǎn)換之后就是:E6 88 91,那么我們直接輸出s又會(huì)是什么呢?
for i,ch := range s{ // ch is a rune fmt.Printf("(%d %X) ",i,ch)}fmt.Println()
結(jié)果為:
(0 68) (1 65) (2 6C) (3 6C) (4 6F) (5 6211) (8 7231) (11 47) (12 4F) (13 5F00) (16 53D1)
其實(shí)通過68 65 6C 6C 6F E6 88 91 E7 88 B1 47 4F E5 BC 80 E5 8F 91 轉(zhuǎn)換成了上面這個(gè)是通過什么轉(zhuǎn)換的呢?其實(shí)通過utf-8轉(zhuǎn)換成了unicode編碼,我們發(fā)現(xiàn)轉(zhuǎn)換成unicode之后,相關(guān)的中文字符編程了長(zhǎng)度為4的16進(jìn)制數(shù),那么其實(shí)就是相當(dāng)于是rune所占的字節(jié)長(zhǎng)度了。
所以我們直接用rune對(duì)其進(jìn)行轉(zhuǎn)換。
for i,ch :=range []rune(s){ fmt.Printf("(%d %c)",i,ch)}
這樣我們就得到了如下
(0 h)(1 e)(2 l)(3 l)(4 o)(5 我)(6 愛)(7 G)(8 O)(9 開)(10 發(fā))
如此,其實(shí)就遍歷獲取到了每個(gè)字符了。
當(dāng)然,如果我們要統(tǒng)計(jì)utf-8下的字符長(zhǎng)度,其實(shí)我們要對(duì)其進(jìn)行轉(zhuǎn)換,在此介紹兩個(gè)函數(shù)
utf8.RuneCountInString(s)utf8.DecodeRune(bytes)
通過這兩個(gè)函數(shù),咱們可以獲取中文字符下的具體的字符個(gè)數(shù)了。
看起來比較零碎,咱們做一下總結(jié),當(dāng)然剩下還是得大家自己寫一下。
本次主要和大家分享了內(nèi)建容器的剩余部分map的定義以及相關(guān)的操作使用,后面還和大家穿插了部分字符串的處理方式,當(dāng)然還是比較散的,后面在寫項(xiàng)目的過程中,咱們到時(shí)候在具體用起來,所以在此希望大家持續(xù)關(guān)注老貓,另外的也希望大家多練習(xí),一起進(jìn)步,加油。
我是老貓,更多內(nèi)容,歡迎大家搜索關(guān)注老貓的公眾號(hào)“程序員老貓”。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124532.html
摘要:序列不是特定的抽象數(shù)據(jù)類型,而是不同類型共有的一組行為。不像抽象數(shù)據(jù)類型,我們并沒有闡述如何構(gòu)造序列。這兩個(gè)選擇器和一個(gè)構(gòu)造器,以及一個(gè)常量共同實(shí)現(xiàn)了抽象數(shù)據(jù)類型的遞歸列表。 2.3 序列 來源:2.3 Sequences 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 序列是數(shù)據(jù)值的順序容器。不像偶對(duì)只有兩個(gè)元素,序列可以擁有任意(但是有限)個(gè)有序元素。 序列在計(jì)算機(jī)科學(xué)中...
摘要:基礎(chǔ)入門之網(wǎng)絡(luò)容器篇本篇文章來自于官方基于文檔的指南學(xué)習(xí)整理如果英語(yǔ)好的同學(xué)其實(shí)可以看文檔,更加詳細(xì)。網(wǎng)絡(luò)篇結(jié)束下面是我在學(xué)習(xí)途中遇到的一些問題而尋找的答案。 基礎(chǔ)入門之網(wǎng)絡(luò)容器篇 Author:zhaojunlike@ Email:[email protected] 本篇文章來自于官方基于文檔的指南學(xué)習(xí)整理 如果英語(yǔ)好的同學(xué)其實(shí)可以看文檔,更加詳細(xì)。傳送門 Step1:...
摘要:注意句柄棧并不是調(diào)用棧中的一部分,但句柄域卻在棧中。一個(gè)依賴于構(gòu)造函數(shù)和析構(gòu)函數(shù)來管理下層對(duì)象的生命周期。對(duì)象模板用來配置將這個(gè)函數(shù)作為構(gòu)造函數(shù)而創(chuàng)建的對(duì)象。 如果你已經(jīng)閱讀過了上手指南,那么你已經(jīng)知道了如何作為一個(gè)單獨(dú)的虛擬機(jī)使用 V8 ,并且熟悉了一些 V8 中的關(guān)鍵概念,如句柄,域 和上下文。在本文檔中,還將繼續(xù)深入討論這些概念并且介紹其他一些在你的 C++ 應(yīng)用中使用 V8 的...
閱讀 1833·2021-11-23 09:51
閱讀 954·2021-10-08 10:05
閱讀 3439·2021-09-26 09:55
閱讀 1046·2021-09-22 15:21
閱讀 1641·2021-09-09 09:33
閱讀 1287·2019-08-30 15:56
閱讀 1292·2019-08-30 15:55
閱讀 974·2019-08-30 13:19