电子商务做网站骗钱怎么办,wordpress 是免费的吗,wordpress 标题截取,华西医院网站开发字典#xff08;map#xff09; 下一篇#xff1a;结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇#xff1a;指针
下一篇#xff1a;结构体
map 是一种无序的基于 key-value 的数据结构#xff0c;Go 语言中的 … 字典map 下一篇结构体1. 声明2. nil 值字典3. 判断某个键是否存在4. 遍历5. delete() 删除键值对6. 约束7. 扩展 上一篇指针
下一篇结构体
map 是一种无序的基于 key-value 的数据结构Go 语言中的 map 是引用类型必须初始化才能使用。map 定义map[keyType]valueType 键值对 默认值为nil。1. 声明 m : make(map[string]int, 8)m[a] 1m[b] 2fmt.Println(m)2. nil 值字典 var m map[int]int// 在一个值为nil的map上做任何操作都不会引起错误delete(m, 2)// 但当我们试图在一个值为nil的map上添加键值对时运行会产生panic//m1[3] 100 // panic: assignment to entry in nil mapfmt.Println(m)3. 判断某个键是否存在
v, ok : map[key] 若存在key则ok为truev为对应值不存在ok为falsev为类型零值。 m1 : map[string]int{a: 10, b: 20}if v, ok : m1[a]; ok {fmt.Println(m中a键的值为, v)}4. 遍历 使用 for range遍历map map是无序的遍历时的元素顺序与添加键值对的顺序无关。
package demoimport (fmtsort
)func main() {m : map[string]int{b: 02, f: 06, a: 01, d: 04, m: 12}// 遍历无序for key, v : range m {fmt.Printf(%s %d \n, key, v)}// 或只获取keyfor key : range m {fmt.Printf(%s %d \n, key, m[key])}// 有序遍历把map的键存入切片对切片排序以实现对map的顺序遍历。var s make([]string, 0, len(m)*2)for k : range m{fmt.Println(k)s append(s, k)}sort.Strings(s)for _, sk : range s {fmt.Printf(%s %02d \n, sk, m[sk])}
}
5. delete() 删除键值对 // delete(map, key)m : map[string]int{b: 02, f: 06, a: 01, d: 04, m: 12}delete(m, d)fmt.Println(m)6. 约束
Go语言字典map类型其实是一个哈希表hash table的特定实现键的类型是受限的而元素可以是任意类型。
Go 语言中 map 的键类型不可以是函数类型、map类型和slice类型。
解析 Go语言规范中键类型的值必须要支持判等操作和!, 函数类型、map类型和slice类型的值不支持判等操作所以字典的键类型不能是这些类型。 如果键的类型是接口类型的那么键的实际类型也不能是以上三种类型否则运行时会引发panic。 如果键的类型是数组类型也要确保数组元素的类型不是以上三种类型。
7. 扩展
1. 为什么健值的类型必须支持判等操作
解析
我们要在哈希表中查找与某个键值对应的那个元素值那么我们需要先把键值作为参数传给这个哈希表。哈希表会先用哈希函数hash function把键值转换为哈希值。哈希值通常是一个无符号的整数。一个哈希表会持有一定数量的桶bucket我们也可以叫它哈希桶这些哈希桶会均匀地储存其所属哈希表收纳的键 - 元素对。
因此哈希表会先用这个键哈希值的低几位去定位到一个哈希桶然后再去这个哈希桶中查找这个键。由于键 - 元素对总是被捆绑在一起存储的所以一旦找到了键就一定能找到对应的元素值。随后哈希表就会把相应的元素值作为结果返回。
只要这个键 - 元素对存在哈希表中就一定会被查找到因为哈希表增、改、删键 - 元素对时的映射过程与前文所述如出一辙。
Go语言的字典中每个键的值都是由它的哈希值代表的。也就是说字典不会独立存储任何键的值但会独立存储它的哈希值。
Go 语言会用被查找键的哈希值与这些哈希值逐个对比看看是否有相等的。如果一个相等的都没有那么就说明这个桶中没有要查找的键值这时 Go 语言就会立刻返回结果了。如果有相等的那就再用键值本身去对比一次。为什么还要对比原因是不同值的哈希值是可能相同的。这有个术语叫做“哈希碰撞”。所以即使哈希值一样键值也不一定一样。如果键类型的值之间无法判断相等那么此时这个映射的过程就没办法继续下去了。最后只有键的哈希值和键值都相等才能说明查找到了匹配的键 - 元素对。
2. 应该优先考虑哪些类型作为字典的键类型
解析求哈希和判等操作的速度越快对应的类型就越适合作为键类型。