[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