在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充当set
map[T]boolm[key]=truem[key]
如何应付特殊的key
hashCode()