go語言中的map(對映、字典)是一種內建的資料結構,它是乙個無序的key-value對的集合,比如以身份證號作為唯一鍵來標識乙個人的資訊。go語言中並沒有提供乙個set型別,但是map中的key也是不相同的,可以用map實現類似set的功能。
map格式為:
map
[keytype]valuetype
在乙個map裡所有的鍵都是唯一的,而且必須是支援==和!=操作符的型別,切片、函式以及包含切片的結構型別這些型別由於具有引用語義,不能作為對映的鍵,使用這些型別會造成編譯錯誤:
dict :=
map[
string
]int
//err, invalid map key type string
map值可以是任意型別,沒有限制。map裡所有鍵的資料型別必須是相同的,值也必須如此,但鍵和值的資料型別可以不相同。
注意:map是無序的,我們無法決定它的返回順序,所以,每次列印結果的順利有可能不同。
建立map
var m1 map
[int
]string
//只是宣告乙個map,沒有初始化, 為空(nil)map
fmt.
println
(m1 ==
nil)
//true
//m1[1] = "luffy" //nil的map不能使用err, panic: assignment to entry in nil map
m2 :=
map[
int]
string
//m2, m3的建立方法是等價的
m3 :=
make
(map
[int
]string
) fmt.
println
(m2, m3)
//map map
m4 :=
make
(map
[int
]string,10
)//第2個引數指定容量
fmt.
println
(m4)
//map
但是!對於map而言,可以使用len()函式,但不能使用cap()函式。初始化map
也可以直接指定初值,要保證key不重複。
//1、定義同時初始化
var m1 map
[int
]string
=map
[int
]string
fmt.
println
(m1)
//map[1:luffy 2:sanji]
//2、自動推導型別 :=
m2 :=
map[
int]
string
fmt.
println
(m2)
常用操作
賦值
m1 :=
map[
int]
string
m1[1]
="nami"
//修改
m1[3]
="zoro"
//追加, go底層會自動為map分配空間
fmt.
println
(m1)
//map[1:nami 2:sanji 3:zoro]
m2 :=
make
(map
[int
]string,10
)//建立map
m2[0]
="aaa"
m2[1]
="bbb"
fmt.
println
(m2)
//map[0:aaa 1:bbb]
fmt.
println
(m2[0]
, m2[1]
)//aaa bbb
遍歷
map的迭代順序是不確定的,並且不同的雜湊函式實現可能導致不同的遍歷順序。在實踐中,遍歷的順序是隨機的,每一次遍歷的順序都不相同。這是故意的,每次都使用隨機的遍歷順序可以強制要求程式不會依賴具體的雜湊函式實現。
m1 :=
map[
int]
string
//遍歷1,第乙個返回值是key,第二個返回值是value
for k, v :=
range m1
//遍歷2,第乙個返回值是key,第二個返回值是value(可省略)
for k :=
range m1
有時候可能需要知道對應的元素是否真的是在map之中。可以使用下標語法判斷某個key是否存在。map的下標語法將產生兩個值,其中第二個是乙個布林值,用於報告元素是否真的存在。
如果key存在,第乙個返回值返回value的值。第二個返回值為 true。
value, ok := m1[1]
fmt.
println
("value = "
, value,
", ok = "
, ok)
//value = mike , ok = true
如果key不存在,第乙個返回值為空,第二個返回值為false。
value2, has := m1[3]
fmt.
println
("value2 = "
, value2,
", has = "
, has)
//value2 = , has = false
刪除
使用delete()函式,指定key值可以方便的刪除map中的k-v對映。
m1 :=
map[
int]
string
for k, v :=
range m1
//1 ----> sanji
//2 ----> sanji
//3 ----> zoro
delete
(m1,2)
//刪除key值為2的map
for k, v :=
range m1
//1 ----> luffy
//3 ----> zoro
delete
(m1,5)
//刪除key值為5的map
for k, v :=
range m1
//1 ----> luffy
//3 ----> zoro
delete()操作是安全的,即使元素不在map中也沒有關係;如果查詢刪除失敗將返回value型別對應的零值。
map輸出結果依然是原來的樣子,且不會有任何錯誤提示。
與slice 相似,在函式間傳遞對映並不會製造出該對映的乙個副本,不是值傳遞,而是引用傳遞:
func
deletemap
(m map
[int
]string
, key int
)//len(m)=2, 1 ----> luffy
//len(m)=2, 3 ----> zoro
}func
main()
deletemap
(m,2
)//刪除key值為2的map
for k, v :=
range m
//len(m)=2, 1 ----> luffy
//len(m)=2, 3 ----> zoro
}
map做函式返回值
返回的依然是引用:
func
test()
map[
int]
string
m1 :=
make
(map
[int
]string,1
)// 建立乙個初創容量為1的map
m1[1]
="luffy"
m1[2]
="sanji"
// 自動擴容
m1[67]
="zoro"
m1[2]
="nami"
// 覆蓋 key值為2 的map
fmt.
println
("m1 = "
, m1)
return m1
}func
main()
輸出:
m1 = map[1:luffy 2:nami 67:zoro]
m2 = map[2:nami 67:zoro 1:luffy]
Golang學習 基礎
一 helloworld 首先是helloworld package main import fmt func main 編譯和執行 go buid hello.go hello 二 變數,常量 1.定義乙個變數 var a int var b int 10 c 10 等價於var c int 10...
golang基礎學習
golang語言基礎保留的關鍵字 1.golang語言的保留關鍵字 2.golang的基礎語法 package 3.golang的基礎語法 import import語法格式主要有兩種 如果乙個main匯入其他包,包將按順序依次匯入 如果匯入的包中依賴其他包 b包 會首先匯入b包,然後初始化b包中的...
GoLang學習基礎筆記
1 make 分配 內部函式 make t,args 的服務目的和 new t 不同,只生成切片,對映和程道,並返回乙個初始化的 不是零 的,type t的,不是 t 的值。這種區分的原因是,這三種型別的資料結構必須在使用前初始化.比如切片是乙個三項的描述符,包含資料指標 陣列內 長度,和容量 在這...