map是golang 的内置类型,也叫映射。
Golang 中的映射是一个哈希表,是键值对的集合。

映射中所有的键都必须具有相同的类型,它们的值也是如此。 不过,可对键和值使用不同的类型。 例如,键可以是数字,值可以是字符串。 若要访问映射中的特定项,可引用该项的键。

创建map

可以使用内置函数make(Type, len, cap)创建map。

make(map[type of key]type of value)

创建map的方式主要有三种:

func main() {
	// 1. 先声明,然后分配内存
	var map1 map[string]int
	// map1["Jack"] = 10  // map1 没有分配内存,不能直接赋值
	map1 = make(map[string]int)
	map1["Jack"] = 80
	fmt.Println(map1)

	// 2. 直接创建并分配内存
	map2 := make(map[string]int)
	map2["Jack"] = 90
	map2["Lucy"] = 100
	fmt.Println(map2)

	// 3. 初始化赋值,并动态分配内存
	map3 := map[string]int{
		"Jack": 100,
		"Lily": 90,
	}
	fmt.Println(map3)
}
//输出:
//map[Jack:80]
//map[Jack:90 Lucy:100]
//map[Jack:100 Lily:90]

map的零值是 nil, 即上述只声明没有分配内存的map,是不能直接赋值的。

map取值

func main() {
	student := map[string]int{
		"Jack": 100,
	}
	JackScore := student["Jack"]
	LucyScore := student["Lucy"]
	fmt.Printf("Jack's score is %d\n", JackScore)
	fmt.Printf("Jack's score is %d", LucyScore)
	// Jack's score is 100
	// 当取值的key在map中不存在时,将返回map value类型的零值
	// Jack's score is 0

}

检查key是否存在

value, ok := map[key]

如果ok 为true, 则key存在,否则不存在。

map的迭代

可以使用 for key, value := range map 对map中的元素进行迭代

func main() {
	student := map[string]int{
		"Jack":    100,
		"Jack Ma": 20,
	}

	for key, value := range student {
		fmt.Printf("%s 's socre is %d\n", key, value)
	}
  //输出:
  //Jack 's socre is 100
  //Jack Ma 's socre is 20

}

for range 迭代不能保证顺序。

删除map中的元素

delete(map, key) 

如果删除一个不存在的key,并不会报错。

map的长度length

可以使用 len(map) 获取map的length

fmt.Printf("student map's length:%d", len(student))

map是引用类型吗?

slice一样,map是引用类型。

func main() {
	student := map[string]int{
		"Jack":    100,
		"Jack Ma": 20,
	}
	studentA := student
	studentA["Jack Ma"] = 80
	for s, i := range student {
		fmt.Printf("student[%s] = %d\n", s, i)
	}
	// 输出:
	// student[Jack] = 100
	// student[Jack Ma] = 80
}

map的比较

map是引用类型,不可以直接使用==操作符进行比较。
如果要比较两个map是否相等,可以递归遍历每个元素进行比较,或使用反射。