成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

跟著老貓來搞GO-內(nèi)建容器Map

james / 1832人閱讀

摘要:當(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ù)和大家分享剩下的容器以及字符字符串的處理。

MAP

map的定義

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

對(duì)map的操作

for k,v :=range m { fmt.Println(k,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)然剩下還是得大家自己寫一下。

  1. 使用range遍歷pos,rune對(duì)
  2. 使用utf8.RuneCountInString(s)獲取字符數(shù)量
  3. 使用len獲取字節(jié)長(zhǎng)度
  4. 使用[]byte獲取字節(jié)

總結(jié)

本次主要和大家分享了內(nèi)建容器的剩余部分map的定義以及相關(guān)的操作使用,后面還和大家穿插了部分字符串的處理方式,當(dāng)然還是比較散的,后面在寫項(xiàng)目的過程中,咱們到時(shí)候在具體用起來,所以在此希望大家持續(xù)關(guān)注老貓,另外的也希望大家多練習(xí),一起進(jìn)步,加油。

我是老貓,更多內(nèi)容,歡迎大家搜索關(guān)注老貓的公眾號(hào)“程序員老貓”。

熱愛技術(shù),熱愛產(chǎn)品,熱愛生活,一個(gè)懂技術(shù),懂產(chǎn)品,懂生活的程序員~更多精彩內(nèi)容,可以關(guān)注公眾號(hào)“程序員老貓”。一起討論技術(shù),探討一下點(diǎn)子,研究研究賺錢!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124532.html

相關(guān)文章

  • SICP Python 描述 2.3 序列

    摘要:序列不是特定的抽象數(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é)中...

    AlexTuan 評(píng)論0 收藏0
  • 02-Docker新手入門網(wǎng)絡(luò)篇

    摘要:基礎(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:...

    王笑朝 評(píng)論0 收藏0
  • [譯] V8 使用者文檔

    摘要:注意句柄棧并不是調(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 的...

    lei___ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<