map字典

栏目: Go · 发布时间: 6年前

内容简介:golang的map实现并不是像c++一样使用红黑树,而是使用了hashmap,用数组来实现。map 是字典的概念,它的格为// 1. 声明    var m map[string]int

golang的map实现并不是像c++一样使用红黑树,而是使用了hashmap,用数组来实现。

map 是字典的概念,它的格为 map[keyType]valueType” 。 map 的读取和设置也类似 slice 一样,通过 key 来操作,只是 slice 的index 只能是`int`类型,而 map 多了很多类型,可以是 int ,可以是 string及所有完全定义了 == 与 != 操作的类型。

// 1. 声明    var m map[string]int

// 2. 初始化,声明之后必须初始化才能使用,向未初始化的map赋值引起 panic: assign to entry in nil map.

m = make(map[string]int)

m = map[string]int{}

// 1&2. 声明并初始化

m := make(map[string]int)

m := map[string]int{}

// 3. 增删改查

m["route"] = 66

delete(m, "route")  // 如果key不存在什么都不做

i := m["route"]  // 三种查询方式,如果key不存在返回value类型的零值

i, ok := m["route"]

_, ok := m["route"]

// 4. 迭代( 顺序不确定

for k, v := range m {

use(k, v)

}

// 5. 有序迭代

import "sort"

var keys []string

for k, _ := range m {

keys = append(keys, k)

}

sort.Strings(keys)

for _, k := range keys {

use(k, m[k]

}

那为什么golang的map是安全的呢,从源码来看,golang的map使用了桶的概念,元素是被hash到桶存储,每个桶预设是存储八个k,v,而且在头部有一个uint8 tophash[8]的结构,存储每个key的高八位(即hash(key) » (64 - 8)),如果该位置未被放置元素,则有一个特殊的标志Empty。在插入删除的时候,首先会比较该uint8跟hash(key)是否相等。当然,桶还利用了overflow指针,可以无限的增长,类似链表。所以,for循环其实是对每个桶进行迭代,判断每个uint8位置,删除操作也并不是实际的memset,而是把对应的tophash的位置置为Empty.因此,在迭代golang的map过程中,使用delete是安全的。


以上所述就是小编给大家介绍的《map字典》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

简约至上

简约至上

[英] Giles Colborne / 李松峰、秦绪文 / 人民邮电出版社 / 2011-1-1 / 35.00

追求简单易用是人类的本性,无论是互联网产品。还是移动应用。亦或其他交互式设计,简单易用始终都是赢得用户的关键。同时,简单易用的程度也与产品寿命的长短密切相关。在《简约至上:交互式设计四策略》中,作者Giles托20多年交互式设计的探索与实践。提出了合理删除、分层组织、适时隐藏和巧妙转移这四个达成简约至上的终极策略,讲述了为什么应该站在主流用户一边,以及如何从他们的真实需求和期望出发,简化设计,提升......一起来看看 《简约至上》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具