前面我們學習了Go語言中的數組,切片類型。但是我們發現使用數組或切片存儲的數據量如果比較大,那麼通過下標來取出某個具體數據的時候,相對來說比較麻煩。
我們在數組或是切片中取值時,往往需要遍歷這個數組或切片。比較麻煩。
那麼有沒有一種數據結構,能夠幫我們快速的取出數據呢?那就Map結構,也就是字典結構。
Go語言中的結構是由鍵和值構成的,與其他語言類似。以鍵值對的形式存在。
某個鍵(key)都對應的一個值(value),如果要查詢某個值,直接根據對應的鍵就可以查詢出該值。
注意,這裏,鍵不能重複。必須唯一。
一、map的定義與初始化
package main
import "fmt"
func main() {
//Map定義與使用
//字典名 map[ keyType ] valueType
var m map[int] string
m = make(map[int] string, 1)
// map [key] key是一個基本數據類型。
// map 是自動擴容的。
m[1] = "啦啦啦"
m[2] = "哈哈哈"
fmt.Println(m)
}
結果:
map[1:啦啦啦 2:哈哈哈]
這裏我們在創建的時候,創建了一個長度的map,但是你會發現,我們在給map中添加數據的時候,一樣可以添加進去。
這是因爲,map這種數據結構,在go語言中,長度 是自動擴容的,並且兩者始終保持相等。
這裏還要說一下,鍵的類型,必須是支持==和!=操作符的類型,切片、函數以及包含切片的結構類型不能作爲字典的鍵,使用這些類型會造成編譯錯誤。
Map中的數據,是無序存儲的。
package main
import "fmt"
func main() {
//Map定義與使用
//字典名 map[ keyType ] valueType
var m map[int] string
m = make(map[int] string, 1)
// map [key] key是一個基本數據類型。
// map 是自動擴容的。
m[1] = "啦啦啦"
m[2] = "哈哈哈"
m[3] = "哦哦哦"
m[4] = "啪啪啪"
fmt.Println(m)
//map中的值
for k, v := range m{
fmt.Println(k,v)
}
}
結果:
map[1:啦啦啦 2:哈哈哈 3:哦哦哦 4:啪啪啪]
1 啦啦啦
2 哈哈哈
3 哦哦哦
4 啪啪啪
Map在定義時需要注意,key是唯一的。另外一種定義方式:
package main
import "fmt"
func main() {
m:= map[string] int {"哈哈": 1, "啦啦": 2, "啪啪": 3}
fmt.Println(m)
}
結果:
map[哈哈:1 啦啦:2 啪啪:3]
二、Map中的值:
map中的值,可以直接循環打印,上面我們已經演示過了。
還可以直接通過鍵輸出值:
package main
import "fmt"
func main() {
m:= map[string] int {"哈哈": 1, "啦啦": 2, "啪啪": 3}
fmt.Println(m["哈哈"])
}
結果:
1
如果在打印中,打印了沒有出現的值,那麼默認爲空。
判斷鍵值是否在map中,如果存在,則打印對應的值,如果不存在,就打印key值不存在
package main
import "fmt"
func main() {
m:= map[string] int {"哈哈": 1000, "啦啦": 2000, "啪啪": 3000}
//判斷
v,ok := m["哈哈"]
if ok{
fmt.Println(v)
}else {
fmt.Println("key值不存在")
}
}
輸出結果:
1000
三、刪除Map中的元素
delete(map,key)
package main
import "fmt"
func main() {
m:= map[int] string {1:"111", 2:"222", 3:"333", 4:"444"}
//打印map m 的對應類型 複合類型
fmt.Printf("%T \n", m)
//刪除元素
delete(m, 1)
fmt.Println(m)
}
打印結果:
map[int]string
map[2:222 3:333 4:444]
這裏注意一下,我們在刪除元素的時候,如果key不存在,也不會報錯。
delete(map,key),刪除操作,沒有返回值。刪除也不會影響map順序。因爲本身map就是無序的
四、Map作爲函數參數
map作爲函數參數進行,傳遞,是地址傳遞,也叫引用傳遞
package main
import "fmt"
func map_add(m map[int]string){
m[2] = "222"
}
func main() {
m:=make(map[int]string,1)
m[1] = "111"
//map 作爲函數參數,是地址傳遞 (引用傳遞)
map_add(m)
fmt.Println(m)
}
結果:
map[1:111 2:222]
map可以在函數中添加數據,影響主調函數中實參的值
map只有長度值,沒有容量值,只能用len()求得長度,不能用cap()求容量。cap在切片中使用。
特殊用法:
m:=make(map[int][]int)
上述這種用法,是map定義key值爲int類型。value值爲切片。
m:=make(map[int][]struct)
上述這種用法,是map定義key值爲int類型。value值爲結構體類型。