glang-07 | 字典

98 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

引言

我叫早花鼠,早花鼠就是我独一无二的标签属性。

字典,也叫映射,是一种存储一系列无序键值对的数据结构,能够基于键快速索引数据,其键就像索引一样,指向该键关联的值。

内部实现

字典可以使用类似处理数组和切片的方式迭代字典中的元素,当因为其键使用哈希值进行索引,使得字典是无序的,且键类型受到了限制(不可以是函数类型、字典类型和切⽚类型)

⽐如,我们要在哈希表中查找与某个键值对应的那个值,那么我们需要先把键作为参数传给这个哈希表。 哈希表会先⽤哈希函数(hash function)把键转换为哈希值。哈希值通常是⼀个⽆符号的整数。⼀个哈希表会持有⼀定数量的桶(bucket), 我们也可以叫它哈希桶,这些哈希桶会均匀地储存其所属哈希表收纳的键值对。 因此,哈希表会先⽤这个键哈希值的低⼏位去定位到⼀个哈希桶,然后再去这个哈希桶中,查找这个键。

由于键值对总是被捆绑在⼀起存储的,所以⼀旦找到了键,就⼀定能找到对应的元素值。随后,哈希表就会把相应的元素值作为结果返回。 只要这个键-元素对存在哈希表中就⼀定会被查找到。

使用

dict := make(map[string]int)    // 创建,键的类型是 string,值的类型是 int的一个空字典
dict := map[string]string{"Red": "#da1337", "Orange": "#e95a22"} //创建一个键和值的类型都是string字典,并进行初始化
​
dict["Yellow"] = "#FFFF00"  // 新增一个键值对for k, v := range dict {    // 迭代字典,循环答应 键-值
    fmt.Println(k, v)
}
​
if value, ok := dict["Red"]; ok {   // 获取键为Red的值,如果存在则打印,并删除 
    fmt.Println(value)
    delete(dict, "Red")
}
​
if value := dict["Orange"]; value != "" {   // 获取键为Red的值,如果存在则打印 
    fmt.Println(value)
}

永远要注意那些可能引发panic的操作,⽐如像⼀个值为 nil 的字典添加键-值对

var dict map[string]string //创建一个nil字典
​
dict["Yellow"] = "#FFFF00"  // panic: assignment to entry in nil map
​
dict2 := make(map[string]string) //使用make管理一个空字典
​
dict2["Yellow"] = "#FFFF00" // success

函数传递字典

func main() {
    colors := map[string]string{    // 创建一个存储颜色以及颜色对应的十六进制代码的字典
        "AliceBlue": "#f0f8ff",
        "Coral": "#ff7F50",
        "DarkGray": "#a9a9a9",
        "ForestGreen": "#228b22",
    } 
​
    for key, value := range colors {    // 显示字典里的所有颜色
        fmt.Printf("Key: %s Value: %s\n", key, value)
    } 
    
    removeColor(colors, "Coral")    // 调用函数来移除指定的键
    for key, value := range colors {    // 显示字典里的所有颜色
        fmt.Printf("Key: %s Value: %s\n", key, value)   
    } 
} 
​
// removeColor 将指定字典里的键删除
func removeColor(colors map[string]string, key string) {
    delete(colors, key)
}

字典在传递时,用很小的成本来复制映射,并且不会复制底层的数据结构