在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的原理
整体上看,go的map采用除留余数法来进行哈希运算。采用拉链法来处理哈希冲突,即使用链表来存储哈希结果相同的元素。思路上与java的HashMap相同,只是具体实现上不大相同。
关于go中map的具体实现,将在下篇文章中具体阐述。
参考资料
- www.topgoer.com/ 《Go语言中文文档》
- docs.hacknode.org 《Go语言圣经》
- blog.csdn.net/qq_38572383…