Go語言基礎(四) map

2021-10-24 13:21:44 字數 3544 閱讀 4664

三、練習題

go語言中提供的對映關係容器為map,其內部使用雜湊表(hash)實現。

map是一種無序的基於key-value的資料結構,go語言中的map是引用型別,必須初始化才能使用。

// map的定義

map[keytype]valuetype

/* keytype:表示鍵的型別。

valuetype:表示鍵對應的值的型別。

*/

map型別的變數預設初始值為nil,需要使用make()函式來分配記憶體。語法為:

make

(map

[keytype]valuetype,

[cap

])

其中cap表示map的容量,該引數雖然不是必須的,但是我們應該在初始化map的時候就為其指定乙個合適的容量。

func

main()

map也支援在宣告的時候填充元素,例如:

func

main()

fmt.

println

(userinfo)

//}

1、判斷某個鍵是否存在

go語言中有個判斷map中鍵是否存在的特殊寫法,格式如下:

value, ok :=

map[key]

舉個栗子:

func

main()

else

}

2、map的遍歷

go語言中使用for range遍歷map。

func

main()

for k :=

range scoremap

}

注意:遍歷map時的元素順序與新增鍵值對的順序無關。

3、使用delete()函式刪除鍵值對

使用delete()內建函式從map中刪除一組鍵值對,delete()函式的格式如下:

delete

(map

, key)

map:表示要刪除鍵值對的map

key:表示要刪除的鍵值對的鍵

4、按照指定順序遍歷map
func

main()

//取出map中的所有key存入切片keys

var keys =

make([

]string,0

,200

)for key :=

range scoremap

//對切片進行排序

sort.

strings

(keys)

//按照排序後的key遍歷map

for_

, key :=

range keys

}

5、元素為map型別的切片
func

main()

fmt.

println

("after init"

)// 對切片中的map元素進行初始化

mapslice[0]

=make

(map

[string

]string,10

) mapslice[0]

["name"]=

"小王子"

mapslice[0]

["password"]=

"123456"

mapslice[0]

["address"]=

"沙河"

for index, value :=

range mapslice

}

6、值為切片型別的map
func

main()

value =

(value,

"北京"

,"上海"

) slicemap[key]

= value

fmt.

println

(slicemap)

}

寫乙個程式,統計乙個字串中每個單詞出現的次數。比如:」how do you do」中how=1 do=2 you=1。

觀察下面**,寫出最終的列印結果。

func

main()

s =(s,3

) fmt.

printf

("%v\n"

, s)

m["q1mi"

]= s

s =(s[:1]

, s[2:

]...

) fmt.

printf

("%v\n"

, s)

fmt.

printf

("%v\n"

, m[

"q1mi"])

}執行結果:[1

23][

13][

133]

// 這個結果你會很意外是吧?

得出結論:

注意新增元素也是一樣的,因為刪除元素的本質其實就是新增元素!

疑問:那麼為什麼m["q1mi"]s長度不一樣呢?

答:因為m[

"q1mi"

]= s,這裡就把s切片的三要素(指標起始位置、len、cap)都賦值給了m[

"q1mi"]/*

所以s的長度變化不會引起m["q1mi"]變化

但是s對底層陣列的操作,卻會引起m["q1mi"]的變化!因為他們底層陣列都使用的乙個

*/

這樣懂了吧?再看看刪除兩個元素的輸出結果:

func

main()

s =(s,4,5

) fmt.

printf

("%v\n"

, s)

m["q1mi"

]= s

s =(s[:1]

, s[3:

]...

)// s = s[2:] 這裡對s的指標起點進行操作,會影響m["q1mi"]?答案:不會

fmt.

printf

("%v\n"

, s)

fmt.

printf

("%v\n"

, m[

"q1mi"])

}執行結果:[1

2345

][14

5][1

4545

]

如果你懂了,這個題你應該就看得懂了。

Go語言基礎(十一)Map

map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索資料,key 類似於索引,指向資料的值。map 是一種集合,所以我們可以像迭代陣列和切片那樣迭代它。不過,map 是無序的,我們無法決定它的返回順序,這是因為 map 是使用 hash 表來實現的。func main m...

go語言基礎之map

go語言中提供的對映關係容器為map,其內部使用雜湊表hash實現 map map是一種無序的基於key value的資料結構,必須初始化才能使用 package main import fmt func main fmt.println map1 判斷某乙個值是否存在 返回兩個引數,1.返回的值 ...

Go語言基礎之map

go語言中提供的對映關係容器為map,其內部使用雜湊表 hash 實現。map是一種無序的基於key value的資料結構,go語言中的map是引用型別,必須初始化才能使用。go語言中map的定義語法如下 map keytype valuetype 其中,map型別的變數預設初始值為nil,需要使用...