package main
import "fmt"
func main() {
m := map[int]string{
1: "小红",
2: "小明",
3: "小刚",
}
m2 := make(map[int]string) //m2 == empty map
var m3 map[int]string //m3 == nil
fmt.Println(m)
fmt.Println(m2)
fmt.Println(m3)
fmt.Println("-------------")
for k, v := range m {
fmt.Println(k, v)
}
}
上述程序包含着几种map的构造方法和打印map的方法
其中,nil和empty map可以混用
运行结果:
问题来了,程序多运行几遍,结果会发生变化:
在解决问题前先来复习一下map的知识点:
package main
import "fmt"
func main() {
m := map[int]string{
1: "小红",
2: "小明",
3: "小刚",
}
name := m[1]
fmt.Println(name)
name2 := m[4]
fmt.Println(name2)
}
有关map的取值
name := m[1],毫无疑问,取的是小红,可是在map中并没有出现4这个key,name2 := m[4]会打印什么呢?
可以看到,打印了一个空字符串
再完善一下代码
package main
import "fmt"
func main() {
m := map[int]string{
1: "小红",
2: "小明",
3: "小刚",
}
name, ok := m[1]
fmt.Println(name, ok)
name2, ok := m[4]
fmt.Println(name2, ok)
}
结果:
即,可以得到,当key不存在的时候,value取到的是该类型值的初始值
再来看看元素的删除:
package main
import "fmt"
func main() {
m := map[int]string{
1: "小红",
2: "小明",
3: "小刚",
}
/* m2 := make(map[int]string) //m2 == empty map
var m3 map[int]string //m3 == nil
fmt.Println(m)
fmt.Println(m2)
fmt.Println(m3)
fmt.Println("-------------")
for k, v := range m {
fmt.Println(k, v)
}
fmt.Println("------")*/
/*name, ok := m[1]
fmt.Println(name, ok)
name2, ok := m[4]
fmt.Println(name2, ok)*/
fmt.Println("del")
name, ok := m[1]
fmt.Println(name, ok)
delete(m, 1)
fmt.Println(m)
}
再回到我们开始的问题,map的遍历采用的是range,然后键值对,但这种遍历不保证顺序,如果要保证顺序,要以切片的方式对key进行排序。
补充个知识点:
关于map中的key:
- map使用哈希表,必须可以比较相等
- 出了slice,map,function中的内建类型,其他都可以作为key
- 自定义的结构也可以作为key