m1[1] = "Nami" //修改
m1[3] = "Zoro" //追加, go底层会自动为map分配空间
fmt.Println(m1) //map[1:Nami 2:Sanji 3:Zoro]
m2 := make(map[int]string, 10) //创建map
m2[0] = "aaa"
m2[1] = "bbb"
fmt.Println(m2) //map[0:aaa 1:bbb]
fmt.Println(m2[0], m2[1]) //aaa bbb
遍历
Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。
m1 := map[int]string{1: "Luffy", 2: "Sanji"}
//遍历1,第一个返回值是key,第二个返回值是value
for k, v := range m1 {
fmt.Printf("%d ----> %s\n", k, v)
//1 ----> Luffy
//2 ----> yoyo
}
//遍历2,第一个返回值是key,第二个返回值是value(可省略)
for k := range m1 {
fmt.Printf("%d ----> %s\n", k, m1[k])
//1 ----> Luffy
//2 ----> Sanji
}
有时候可能需要知道对应的元素是否真的是在map之中。可以使用下标语法判断某个key是否存在。map的下标语法将产生两个值,其中第二个是一个布尔值,用于报告元素是否真的存在。
如果key存在,第一个返回值返回value的值。第二个返回值为 true。
value, ok := m1[1]
fmt.Println("value = ", value, ", ok = ", ok) //value = mike , ok = true
如果key不存在,第一个返回值为空,第二个返回值为false。
value2, has := m1[3]
fmt.Println("value2 = ", value2, ", has = ", has) //value2 = , has = false
删除
使用delete()函数,指定key值可以方便的删除map中的k-v映射。
m1 := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
for k, v := range m1 { //遍历,第一个返回值是key,第二个返回值是value
fmt.Printf("%d ----> %s\n", k, v)
}
//1 ----> Sanji
//2 ----> Sanji
//3 ----> Zoro
delete(m1, 2) //删除key值为2的map
for k, v := range m1 {
fmt.Printf("%d ----> %s\n", k, v)
}
//1 ----> Luffy
//3 ----> Zoro
delete()操作是安全的,即使元素不在map中也没有关系;如果查找删除失败将返回value类型对应的零值。
如:
delete(m1, 5) //删除key值为5的map
for k, v := range m1 {
fmt.Printf("%d ----> %s\n", k, v)
}
//1 ----> Luffy
//3 ----> Zoro
map输出结果依然是原来的样子,且不会有任何错误提示。