map字典

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

内容简介: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字典》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

HTML5

HTML5

Matthew David / Focal Press / 2010-07-29 / USD 39.95

Implement the powerful new multimedia and interactive capabilities offered by HTML5, including style control tools, illustration tools, video, audio, and rich media solutions. Understand how HTML5 is ......一起来看看 《HTML5》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

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

RGB CMYK 互转工具