Go中的Map

611 阅读2分钟

Go中的Map

概念

  1. map是一种数据结构, 一个集合, 存储一系列无序的键值对
  2. map基于存储的, 键值相当于索引
  3. map可以通过键快速索引数据, 键指向该键关联的值

内部实现

  1. map是给予hash(散列表)来实现的, 每次打印的key和value都是无序的, 每次迭代都不一样
  2. map的散列表包含一组桶, 每次存储和查找键值对的时候, 都要先选择一个桶, 就是把指定的键传给散列函数, 就可以索引到相应的桶, 进而找到对应的键值
  3. map存储的是无序的键值对集合, 存储的数据越多, 索引分布越均匀, 反问键值对的速度就越快

声明和初始化

  1. 使用make进行创建map
    dict := make(map[string]int)
    dict["aaa"] = 123
    
  2. 使用:=进行创建和初始化map
    dict := map[string]int{"aaa": 123, "bbb": 456}
    
  3. 使用:=创建一个空的map
    dict := map[string]int{}
    
  4. 使用make创建一个值为nil的map
    var dict map[string]int
    // 创建为nil的map后不能直接操作, 必须先初始化
    dict = make(map[string]int)
    dict['aaa'] = 123
    

map的特性

  1. map的键可以是任何值, 键的类型可以是任何类型(也可以是结构类型)
  2. 键值可以使用==进行比较, 所以像切片, 函数和含有切片的结构类型就不能使用map进行构建, 他们具有引用的语义无法进行比较
  3. 切片等不能再键中使用, 可以在值中使用

使用map

  1. 通过键设置和获得map中的值

    dict := make(map[string]int)
    dict['aaa'] = 123
    count := dict['aaa']
    
  2. 判断值是否存在

    count, age := dict['aaa']
    if (age != nil) {
        ...
    }
    
  3. 使用delete删除map中的键值对

    delete(dict, 'aaa')
    
  4. 使用for range遍历map

    func 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
}