Go中的Map
概念
- map是一种数据结构, 一个集合, 存储一系列无序的键值对
- map基于键存储的, 键值相当于索引
- map可以通过键快速索引数据, 键指向该键关联的值
内部实现
- map是给予hash(散列表)来实现的, 每次打印的key和value都是无序的, 每次迭代都不一样
- map的散列表包含一组桶, 每次存储和查找键值对的时候, 都要先选择一个桶, 就是把指定的键传给散列函数, 就可以索引到相应的桶, 进而找到对应的键值
- map存储的是无序的键值对集合, 存储的数据越多, 索引分布越均匀, 反问键值对的速度就越快
声明和初始化
- 使用
make进行创建mapdict := make(map[string]int) dict["aaa"] = 123 - 使用
:=进行创建和初始化mapdict := map[string]int{"aaa": 123, "bbb": 456} - 使用
:=创建一个空的mapdict := map[string]int{} - 使用
make创建一个值为nil的mapvar dict map[string]int // 创建为nil的map后不能直接操作, 必须先初始化 dict = make(map[string]int) dict['aaa'] = 123
map的特性
- map的键可以是任何值, 键的类型可以是任何类型(也可以是结构类型)
- 键值可以使用
==进行比较, 所以像切片, 函数和含有切片的结构类型就不能使用map进行构建, 他们具有引用的语义无法进行比较 - 切片等不能再键中使用, 可以在值中使用
使用map
-
通过键设置和获得map中的值
dict := make(map[string]int) dict['aaa'] = 123 count := dict['aaa'] -
判断值是否存在
count, age := dict['aaa'] if (age != nil) { ... } -
使用
delete删除map中的键值对delete(dict, 'aaa') -
使用
for range遍历mapfunc main() { dict := map[string]int{"王五": 60, "张三": 43} var names []string for name := range dict { names = append(names, name) } sort.Strings(names) //排序 for _, key := range names { fmt.Println(key, dict[key]) } }
函数间传递map
函数中的map传递不会复制, 函数中修改键值对会对原来的map产生影响, 属于引用传递
func main() {
dict := map[string]int{"王五": 60, "张三": 43}
modify(dict)
fmt.Println(dict["张三"])
}
func modify(dict map[string]int) {
dict["张三"] = 10
}