[TOC]
# Map
Go語言中提供的映射關系容器為`map`,其內部使用`散列表(hash)`實現,所以它是一種`無序`的基于`key-value`的數據結構,同時也是一種引用類型,必須初始化才能使用。
## map定義
~~~
map[KeyType]ValueType
~~~
* KeyType:表示鍵的類型。
* ValueType:表示鍵對應的值的類型。
map類型的變量默認初始值為`nil`,需要使用make()函數來分配內存。語法為:
~~~
make(map[KeyType]ValueType, [cap])
~~~
其中`cap`表示map的容量,該參數雖然不是必須的,但是我們應該在初始化map的時候就為其指定一個合適的容量。
## map基本使用
map中的數據都是成對出現的
~~~go
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["大雄"] = 90
scoreMap["胖虎"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["大雄"])
fmt.Printf("type of a:%T\n", scoreMap)
}
~~~
output:
~~~bash
map[大雄:90?胖虎:100]
90
type?of?a:map[string]int
~~~
map也支持在聲明的時候填充元素
eg:
~~~
userInfo := map[string]int{
"roomNum": 2021,
"age": 18,
}
fmt.Println(userInfo) //
~~~
## 判斷某個鍵是否存在
格式:`value, ok := map[key]`
~~~
func main() {
scoreMap := make(map[string]int)
scoreMap["大雄"] = 99
scoreMap["小叮當"] = 18
// 如果key存在ok為true,v為對應的值;不存在ok為false,v為值類型的零值
v, ok := scoreMap["大雄"]
if ok {
fmt.Println(v)
} else {
fmt.Println("小心胖虎揍你!")
}
}
~~~
## map的遍歷
`for range`遍歷map。
~~~go
func main() {
scoreMap := make(map[string]int)
scoreMap["大雄"] = 99
scoreMap["小叮當"] = 18
scoreMap["靜香"] = 98
for k, v := range scoreMap {
fmt.Println(k, v)
}
}
~~~
只想遍歷key的時候
~~~go
func main() {
scoreMap := make(map[string]int)
scoreMap["大雄"] = 99
scoreMap["小叮當"] = 18
scoreMap["靜香"] = 98
for k := range scoreMap {
fmt.Println(k)
}
}
~~~
**注意:**遍歷map時的元素順序與添加鍵值對的順序無關。
## 使用delete()函數刪除鍵值對
格式:`delete(map,key)`
~~~
func main(){
scoreMap := make(map[string]int)
scoreMap["大雄"] = 99
scoreMap["小叮當"] = 18
scoreMap["靜香"] = 98
//因為大雄和小叮當是真愛,那就刪除靜香吧
delete(scoreMap, "靜香")
for k := range scoreMap {
fmt.Println(k)
}
}
~~~
output:
~~~
大雄
小叮當
~~~
## 按照指定順序遍歷map
~~~
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
}
//取出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類型的切片
~~~
func main() {
var mapSlice = make([]map[string]string, 3)
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
fmt.Println("after init")
// 對切片中的map元素進行初始化
mapSlice[0] = make(map[string]string, 10)
mapSlice[0]["name"] = "小叮當"
mapSlice[0]["age"] = "18"
mapSlice[0]["address"] = "北京"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}
~~~
## 值為切片類型的map
~~~
func main() {
var sliceMap = make(map[string][]string, 3)
key := "哆啦A夢"
value, ok := sliceMap[key]
if !ok {
value = make([]string, 0, 2)
}
value = append(value, "大雄", "小叮當")
sliceMap[key] = value
fmt.Println(sliceMap)//map[哆啦A夢:[大雄?小叮當]]
}
~~~
- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker