Go語言學習 (六)map

2021-10-04 19:07:42 字數 3675 閱讀 5826

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

go語言中map的定義語法如下:

map[keytype]valuetype
其中,

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

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

map中的資料都是成對出現的,map的基本使用示例**如下:

/* 建立map,並初始化 */

var m1 map[string]int

fmt.println(m1 == nil) //true:還沒有初始化(沒有在記憶體中開闢空間)

m1 = make(map[string]int, 10) //估算好map的容量,避免在程式執行期間在動態擴容

m1["李子健"] = 100

m1["lizijian"] = 10

fmt.println(m1)

輸出:

true

map[lizijian:10 李子健:100]

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

func main() 

fmt.println(userinfo) //

}

/* 向map中取資料,(會返回兩個值,value和ok一起接受)

約定熟成用ok接受返回的bool值 */

value, ok := m1["李子健"]

if !ok else

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

/* 遍歷map值 */

for key, value := range m1

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

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

delete(map, key)
其中,

示例**如下:

/* 刪除map */

delete(m1, "lizijian")

delete(m1, "lijiayang") //刪除不存在的值不報錯

fmt.println(m1)

/* 按照指定的key值順序取出值 */

m2 := make(map[string]int, 100)

// 生成乙個隨機的map

for i := 0; i < 100; i++

fmt.println(m2)

//用乙個切片keys去儲存map中所有的key值

var keys = make(string, 0, 200)

for key := range m2

//對切片進行排序

sort.strings(keys)

//通過排好序的keys中的key去遍歷map

for _, key := range keys

下面的**演示了切片中的元素為map型別時的操作:

/* 元素為map型別的切片 */

mapslice := make(map[int]string, 10, 10)

//初始化乙個型別為map的切片

for i, v := range mapslice

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

mapslice[0] = make(map[int]string, 10)

mapslice[0][1] = "小王子"

for index, value := range mapslice

注意:切片和map都是引用型別,使用的時候都需要初始化

下面的**演示了map中值為切片型別的操作:

/*值為切片型別的操作:*/

slicemap:=make(map[string]int,10)

value1:=make(int,10,10)//很重要

slicemap["李子健"]=value1//很重要

for key,value:=range slicemap

我們先來看乙個例子:

func main()
執行上面的**會引發panic,為什麼呢? 在go語言中對於引用型別的變數,我們在使用的時候不僅要宣告它,還要為它分配記憶體空間,否則我們的值就沒辦法儲存。而對於值型別的宣告不需要分配記憶體空間,是因為它們在宣告的時候已經預設分配好了記憶體空間。要分配記憶體,就引出來今天的new和make。 go語言中new和make是內建的兩個函式,主要用來分配記憶體。

new是乙個內建的函式,它的函式簽名如下:

func new(type) *type
其中,

new函式不太常用,使用new函式得到的是乙個型別的指標,並且該指標對應的值為該型別的零值。舉個例子:

func main()
本節開始的示例**中var a *int只是宣告了乙個指標變數a但是沒有初始化,指標作為引用型別需要初始化後才會擁有記憶體空間,才可以給它賦值。應該按照如下方式使用內建的new函式對a進行初始化之後就可以正常對其賦值了:

func main()
make也是用於記憶體分配的,區別於new,它只用於slice、map以及chan的記憶體建立,而且它返回的型別就是這三個型別本身,而不是他們的指標型別,因為這三種型別就是引用型別,所以就沒有必要返回他們的指標了。make函式的函式簽名如下:

func make(t type, size ...integertype) type
make函式是無可替代的,我們在使用slice、map以及channel的時候,都需要使用make進行初始化,然後才可以對它們進行操作。這個我們在上一章中都有說明,關於channel我們會在後續的章節詳細說明。

本節開始的示例中var b map[string]int只是宣告變數b是乙個map型別的變數,需要像下面的示例**一樣使用make函式進行初始化操作之後,才能對其進行鍵值對賦值:

func main()
二者都是用來做記憶體分配的。

make只用於slice、map以及channel的初始化,返回的還是這三個引用型別本身;而new用於型別的記憶體分配,並且記憶體對應的值為型別零值,返回的是指向型別的指標。

​​​​​​​

本文參考李文周的部落格,並加了一些自己的理解

Go語言學習筆記 map

學習筆記根據 無聞 go語言基礎教程 整理 package main import fmt sort func main 普通建立方式 func test1 fmt.println m map 使用make關鍵字建立 func test2 直接宣告和賦值建立 func test3 使用更簡單的方式 ...

go語言學習筆記 map

理解 map是由一組無序的鍵key值value對集合的內建型別,可以通過鍵來獲取對應的值,map和slices一樣,也是引用型別 注意 map之間不能使用 操作符來判斷 建立map 語法 map type of key type of value var mymap map string int n...

go語言學習筆記 map

go語言內建有map這種資料結構,它由無序的鍵值對組成,跟大部分語言中的map用法非常相似。它的鍵不能由可變型別 引用語義 的結構型別擔當,如切片 陣列 函式等等。map只有len,沒有cap。我們可以直接定義,或者通過make函式建立,通過make函式建立時,可以指定容量。package main...