main.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import "fmt"
  3. func main() {
  4. // 1. map[键类型]值类型:这里用姓名 string 查找成绩 int。
  5. fmt.Println("=== 创建与查询 ===")
  6. scores := map[string]int{
  7. "小朱": 90,
  8. "小李": 75,
  9. "小王": 0,
  10. }
  11. fmt.Printf("学生数量:%d\n", len(scores))
  12. fmt.Printf("小朱的成绩:%d\n", scores["小朱"])
  13. // 2. 新键是新增,已有键是修改;同一个 map 的键唯一。
  14. fmt.Println("\n=== 新增与修改 ===")
  15. scores["小陈"] = 88
  16. scores["小李"] = 80
  17. fmt.Printf("新增小陈:%d,修改小李:%d\n", scores["小陈"], scores["小李"])
  18. fmt.Printf("学生数量:%d\n", len(scores))
  19. // 3. 读取不存在的键会得到值类型的零值,不会自动新增这个键。
  20. // 仅凭 0 无法区分“成绩是 0”和“没有这个学生”,需要第二个返回值 ok。
  21. fmt.Println("\n=== 判断键是否存在 ===")
  22. fmt.Printf("直接查询小赵:%d\n", scores["小赵"])
  23. score, ok := scores["小王"]
  24. fmt.Printf("查询小王:成绩=%d,存在=%t\n", score, ok)
  25. score, ok = scores["小赵"] // 变量已声明,这里用 = 赋值。
  26. fmt.Printf("查询小赵:成绩=%d,存在=%t\n", score, ok)
  27. // 也可以把查询放在 if 的初始化语句中。
  28. // value 和 exists 只在这个 if / else 语句内有效。
  29. if value, exists := scores["小李"]; exists {
  30. fmt.Printf("找到小李,成绩:%d\n", value)
  31. } else {
  32. fmt.Println("没有找到小李")
  33. }
  34. // 4. delete 删除键;删除不存在的键也不会报错。
  35. fmt.Println("\n=== 删除 ===")
  36. delete(scores, "小王")
  37. delete(scores, "不存在的学生")
  38. _, ok = scores["小王"]
  39. fmt.Printf("删除后小王存在:%t,学生数量:%d\n", ok, len(scores))
  40. // 5. range 遍历 map 的顺序不保证固定,不能依赖插入顺序。
  41. // 这里只做求和,不按遍历顺序输出,因此结果稳定。
  42. fmt.Println("\n=== 遍历与统计 ===")
  43. total := 0
  44. for _, value := range scores {
  45. total += value
  46. }
  47. fmt.Printf("总分:%d\n", total)
  48. if len(scores) > 0 {
  49. average := float64(total) / float64(len(scores))
  50. fmt.Printf("平均分:%.2f\n", average)
  51. }
  52. // 要固定显示顺序,可按一个明确的姓名切片逐项查询。
  53. for _, name := range []string{"小朱", "小李", "小陈"} {
  54. fmt.Printf("%s:%d\n", name, scores[name])
  55. }
  56. // 6. map 的零值是 nil:可以读取、查询、删除,但不能直接写入。
  57. fmt.Println("\n=== nil 与 make ===")
  58. var tasks map[string]bool
  59. fmt.Printf("初始化前:nil=%t,长度=%d,读取结果=%t\n", tasks == nil, len(tasks), tasks["复习"])
  60. // tasks["复习"] = true // 错误:向 nil map 写入会发生运行时 panic。
  61. tasks = make(map[string]bool)
  62. tasks["复习"] = true
  63. fmt.Printf("初始化后:nil=%t,复习完成=%t\n", tasks == nil, tasks["复习"])
  64. // 7. map 赋值不会复制所有元素,两个变量会指向同一份 map 数据。
  65. fmt.Println("\n=== 赋值与共享 ===")
  66. alias := scores
  67. alias["小朱"] = 95
  68. fmt.Printf("通过 alias 修改后,小朱的原成绩也变为:%d\n", scores["小朱"])
  69. }