Go字典类型的使用

peace&Dola Sun 作品

时光驯服一切,我与往事之间,像回声,再怎么千回百转,终究消失在山谷。 by 七堇年

引用于:http://wufazhuce.com/one/1373

map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。

map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable 等。

基础知识

  • map 是引用类型。
  • 未初始化的 map 的值是 nil。
  • 在声明的时候不需要知道 map 的长度,map 是可以动态增长的。
  • value 可以是任意类型的;通过使用空接口类型,我们可以存储任意值,但是使用这种类型作为值时需要先做一次类型断言。
  • map 传递给函数的代价很小:在 32 位机器上占 4 个字节,64 位机器上占 8 个字节,无论实际上存储了多少数据。通过 key 在 map 中寻找值是很快的,比线性查找快得多,但是仍然比从数组和切片的索引中直接读取要慢 100 倍;所以如果你很在乎性能的话还是建议用切片来解决问题。
  • 声明格式:var map1 map[keytype]valuetype
  • 初始化格式:make(map[keytype]valuetype)
  • 另一种初始化格式:map[keytype]valuetype{key:value},类似数组、结构体初始化方式。
  • 不要使用 new,永远用 make 来构造 map
  • 常用的 len(map1) 方法可以获得 map 中的 pair 数目,这个数目是可以伸缩的,因为 map-pairs 在运行时可以动态添加和删除。
  • map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序
  • 如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序(使用 sort 包),然后可以使用切片的 for-range 方法打印出所有的 key 和 value。
  • map 类型是非线程安全的.当并行访问一个共享的 map 类型的数据,map 数据将会出错

示例

func Test_demo1(t *testing.T) {
    temp_map := map[string]int{"a": 1, "b": 2, "c": 3}

    //如果map中不存在key1,val1就是一个值类型的空值。
    fmt.Println(temp_map["d"]) //0

    //判断key是否存在
    val, ok := temp_map["d"]
    fmt.Println(ok) //false
    fmt.Println(val) //0

    val, ok = temp_map["c"]
    fmt.Println(ok) //true
    fmt.Println(val) //3

    //与if混合使用
    if _, ok = temp_map["a"]; ok {
        fmt.Println(temp_map["a"]) //1
    }

    //删除key
    delete(temp_map, "a")
    fmt.Println(temp_map) //map[b:2 c:3]

    //配合for...range使用
    for key, val := range temp_map {
        fmt.Printf("map[%s]=%d ", key, val) //map[b]=2 map[c]=3
    }
}

map 类型的切片

func Test_demo2(t *testing.T) {
    temp_slice := make([]map[string]int, 3)
    for i := range temp_slice {
        temp_slice[i] = make(map[string]int)
        temp_slice[i]["a"] = 1
    }
    fmt.Println(temp_slice) //[map[a:1] map[a:1] map[a:1]]

    //最好不要这样写
    temp_slice2 := make([]map[string]int, 3)
    for _, item := range temp_slice2 {
        item = make(map[string]int) //注意:item仅是temp_slice2内部元素的副本
        item["a"] = 1 //对item的值修改,不会影响temp_slice2内部元素的值
    }
    fmt.Println(temp_slice2) //[map[] map[] map[]]
}

map 排序

func Test_demo3(t *testing.T) {
    temp_map := map[string]int{"e": 1, "f": 2, "c": 3, "g": 4, "w": 5}
    temp_slice := make([]string, len(temp_map))

    i := 0
    for k, _ := range temp_map {
        temp_slice[i] = k
        i++
    }

    sort.Strings(temp_slice)
    for _, val := range temp_slice {
        fmt.Printf("map[%s]=%d ", val, temp_map[val])
        //map[c]=3 map[e]=1 map[f]=2 map[g]=4 map[w]=5
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容