在golang中,map是散列表的引用,也就是说它是引用类型,像指针那样。
map[K]V
初始化map
m := make(map[string]int) // 方式一
m := map[string]int{} // 方式二
避免对零值(未初始化)的map设置kv。
var ages map[string]int
ages["tom"] = 12 // 异常
var ages := map[string]int{}
ages["tom"] = 12 // 正常
赋值
m["foo"] = 1
m["bar"] = 2
// 初始化带赋值
m2 := map[string]int{
"foo": 1,
"bar": 2, //注意这个标点符号,是不能少的Ï
}
访问元素、删除元素
delete
m["hello"] = 3
fmt.Println(m["hello"]) // 3
delete(m, "hello")
fmt.Println(m["hello"]) // 0
fmt.Println(m["nothing"]) // 0
访问不存在的key,也不会抛出异常,而是会返回map value的零值。
fmt.Println(m["nothing"]) // 0
m["nothing"]++
fmt.Println(m["nothing"]) // 1
判断key是否存在
既然不管key存在不存在,map都会返回一个值,那如何区分map里到底是包含了个本来就是空值的key还是根本没有这个key呢?
其实通过key来访问value的话,返回两个值,第一个值是元素的value,第二个值就是这个key是否存在。
if value, ok := m["nothing-2"]; ok {
fmt.Println("存在,value = " + strconv.Itoa(value))
} else {
fmt.Println("不存在")
}
元素的指针
&m["foo"]
元素的遍历
for k, v := range m {
fmt.Printf("%s = %d\n", k, v)
}
sort
names := make([]string, 0, len(m))
for k := range m {
names = append(names, k)
}
sort.Strings(names)
for _, name := range names {
fmt.Printf("%s = %d\n", name, m[name])
}
map的可比较性
和slice一样,map不可比较。
如何用map充当setmap[T]boolm[key]=truem[key]
如何应付特殊的key
hashCode()