map
- 對映關係容器 內部使用雜湊表(hash)實現
- map是引用型別 必須初始化才能使用
- 無序的基於key-value的資料結構
map定義
map的定義語法:
map[KeyType]ValueType
其中,
- KeyType:表示鍵的型別。
- ValueType:表示鍵對應的值的型別。
map型別的變數預設初始值為nil,需要使用make()函式來分配記憶體。語法為:
make(map[KeyType]ValueType, [cap])
其中cap表示map的容量,該引數不是必須的,但是在初始化map的時候應該為其指定一個合適的容量
map基本使用
判斷某個鍵是否存在
判斷map中鍵是否存在 :
value, ok := map[key]
map的遍歷
使用for range遍歷map
使用delete()函式刪除鍵值對
delete()格式:
delete(map, key)
其中,
- map:表示要刪除鍵值對的map
- key:表示要刪除的鍵值對的鍵
go doc builtin.delete 檢視文件
package main
import "fmt"
// map
func main(){
var m1 map[string]int
fmt.Println(m1==nil) // 還沒有初始化(沒有在記憶體中開闢空間)
m1 = make(map[string]int, 10) // 要估算號該map容量,避免在程式執行期間再動態擴容
m1["理想"] = 18
m1["李時珍"] = 35
fmt.Println(m1)
fmt.Println(m1["理想"])
// 約定成俗用OK接收返回的布林值
fmt.Println(m1["貂蟬"]) // 0 如果不存在這個key拿到對應值型別的零值
value, ok := m1["貂蟬"]
if !ok {
fmt.Println("查無此key")
} else {
fmt.Println(value)
}
// map的遍歷
for k, v := range m1 {
fmt.Println(k, v)
}
// 遍歷key
for k := range m1 {
fmt.Println(k)
}
// 只遍歷value
for _, v := range m1 {
fmt.Println(v)
}
// 刪除
delete(m1, "李時珍")
fmt.Println(m1)
delete(m1, "李白") // 刪除不存在的key
}
按照指定順序遍歷map
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano()) //初始化隨機數種子 當前時間納秒數
var scoreMap = make(map[string]int, 200)
for i := 0; i < 100; i++ {
key := fmt.Sprintf("stu%02d", i) //生成stu開頭的字串
value := rand.Intn(100) //生成0~99的隨機整數
scoreMap[key] = value
}
fmt.Println(scoreMap)
//取出map中的所有key存入切片keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
//對切片進行排序
sort.Strings(keys)
//按照排序後的key遍歷map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}
元素為map型別的切片
值為切片型別的map
一定要初始化
package main
import "fmt"
// map和slice組合
func main(){
// 元素型別為map的切片
// var s1 = make([]map[int]string, 0, 10) // 長度為0 內部沒有元素
// var s1 = make([]map[int]string, 1, 10)
var s1 = make([]map[int]string, 10, 10)
// 沒有對內部的map做初始化
// s1[0][100] = "A"
s1[0] = make(map[int]string, 1)
s1[0][10] = "泰山"
// fmt.Println(s1) // index out of range [0] with length 0
// fmt.Println(s1) // panic: assignment to entry in nil map
fmt.Println(s1) // [map[10:泰山] map[] map[] map[] map[] map[] map[] map[] map[] map[]]
// 值為切片型別的map
var m1 = make(map[string][]int, 10)
m1["北京"] = []int{10, 20, 30}
fmt.Println(m1)
}