Go中的map | Go主题月

172 阅读1分钟

在go中,一个map是一个哈希表的引用。哈希表是一个键值对的集合。

创建一个map

内置的make函数创建map

m := make(map[string]int) // 从string到int的映射
m["who"] = 100

使用go字面量创建map,同时还可以指定一些最初的key/value

m := map[string]int{
    "alice": 10,
    "charlie": 34
}

map的一些操作

遍历map

for name, age := range ages {
    fmt.Println("%s\t%d\n", name, age)
}

判断键是否存在

value, ok := ages["who"]
if !ok {
    /* */
}

使用delete()函数删除键值对

delete(m, "clz")

按照指定顺序遍历map

先使用sort模块对键排序,然后按键顺序取值。

import "sort"

var names []string
for name := range ages {
    names = append(names, name)
}
sort.Strings(names)
for _, name := range names {
    fmt.Printf("%s\t%d\n", name, ages[name])
}

将map用作set

go语言中并没有set类型,但是map中的key是不可重复,所以可以将map用作set

seen := make(map[string]bool) // a set of strings

可以将这种忽略value的map当作一个字符串集合。

这里我想到了java的HashSet,就是基于哈希表的set

map的原理

1aa15e9f3d78b3e66dacbead2990f78aa08.jpg

整体上看,go的map采用除留余数法来进行哈希运算。采用拉链法来处理哈希冲突,即使用链表来存储哈希结果相同的元素。思路上与java的HashMap相同,只是具体实现上不大相同。

关于go中map的具体实现,将在下篇文章中具体阐述。

参考资料

  1. www.topgoer.com/ 《Go语言中文文档》
  2. docs.hacknode.org 《Go语言圣经》
  3. blog.csdn.net/qq_38572383…