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...