【Goland】:Map

目录

[1. Map的概念](#1. Map的概念)

[2. Map的增删查改](#2. Map的增删查改)

[2.1 新增 / 修改](#2.1 新增 / 修改)

[2.2 查询](#2.2 查询)

[2.3 删除](#2.3 删除)

[2.4 遍历](#2.4 遍历)

[3. Map元素排序](#3. Map元素排序)

[4. Map切片](#4. Map切片)


1. Map的概念

map 是一种 键值对(key-value) 的无序集合,类似于C++ 里的 哈希表

  • Key(键) :必须是支持比较的类型(如 intstringbool、指针等)。不能用 slicemapfunction 作为 key。

  • Value(值):可以是任意类型(包括切片、结构体、函数等)。

  • 无序:Map 的迭代顺序是随机的,每次遍历结果可能不同。

1. 使用 make 创建

复制代码
    m := make(map[string]int)
	m["苹果"] = 1
	m["香蕉"] = 2
	fmt.Println(m)      // map[苹果:1 香蕉:2]

2. 使用字面量创建

复制代码
    m := map[string]string{
		"apple": "苹果",
		"hello": "你好",
	}

	fmt.Println(m) // map[apple:苹果 hello:你好]

2. Map的增删查改

2.1 新增 / 修改

  • 语法:map[key] = value

  • 如果 key 不存在 → 新增

  • 如果 key 已存在 → 更新

    复制代码
      m := map[string]string{
      	"apple": "苹果",
      	"hello": "你好",
      }
      m["pear"] = "梨"    // key 不存在 → 新增
      m["hello"] = "哈喽" // key 已存在 → 更新
      fmt.Println(m) // map[apple:苹果 hello:哈喽 pear:梨]

2.2 查询

  • 直接用 map[key] 取值

  • 如果 key 不存在 → 返回该 value 类型的 零值

  • 想区分 "零值" 和 "不存在" → 用 value, ok := map[key]

    复制代码
      m := map[string]string{
      	"apple": "苹果",
      	"hello": "你好",
      }
    
      // 查询存在的 key
      fmt.Println(m["apple"]) // 苹果
      // 查询不存在的 key
      fmt.Println(m["pear"]) // "" (string 的零值)
    
      // 判断 key 是否存在
      a, ok1 := m["apple"]
      fmt.Println(a, ok1) // 苹果 true
    
      b, ok2 := m["pear"]
      fmt.Println(b, ok2)  // "" false

2.3 删除

  • 使用内建函数 delete(map, key)

  • 删除不存在的 key 不会报错

    复制代码
      m := map[string]string{
      	"apple": "苹果",
      	"hello": "你好",
      }
      delete(m, "apple")
      fmt.Println(m)     // map[hello:你好]

2.4 遍历

  • map中的键值对是无序的,每次遍历map得到的键值对序列都是不可预测的。

    复制代码
      m := map[string]string{
      	"apple": "苹果",
      	"hello": "你好",
      }
      for k, v := range m {
      	fmt.Printf("key=%s, value=%s\n", k, v)
      }

3. Map元素排序

Map 是无序的 ,遍历顺序是随机的(即使多次遍历同一个 map,顺序也可能不一样)。

如果我们想对 map 里的 key 或 value 排序 ,需要 先把 key 或 value 拷贝出来放到切片中,再排序

复制代码
	m := map[int]string{
		1: "周一",
		7: "周日",
		3: "周三",
		2: "周二",
		5: "周五",
		4: "周四",
		6: "周六",
	}
	// 1. 获取map中所有的key
	var key []int
	for k := range m {
		key = append(key, k)
	}
	// 2. 排序key值
	sort.Ints(key)
	
	// 3. 遍历key
	for _, k := range key {
		fmt.Println(k, m[k])
	}

4. Map切片

切片和 map 是两种不同的数据结构

  • map 是键值对集合

  • slice 是动态数组

map 切片 ,就是一个 切片,切片的每个元素是 map

复制代码
[]map[keyType]valueType

// map 切片 = 切片的每个元素是 map

这种结构常用于存储 多个 map 的集合,例如多个学生的信息,每个学生的信息用一个 map 表示,所有学生放到一个切片里。

复制代码
	var a = make([]map[string]int, 2)

	a[0] = make(map[string]int)
	a[0]["赵一"] = 1
	a[0]["王二"] = 2

	a[1] = make(map[string]int)
	a[1]["张三"] = 3
	a[1]["李四"] = 4

	for i, v := range a {
		fmt.Println(i, v)
	}
	/*
	0 map[王二:2 赵一:1]
	1 map[张三:3 李四:4]
	*/

追加 map

复制代码
    // 定义一个空切片
	var users []map[string]string

	// 追加 map
	users = append(users, map[string]string{"name": "Tom", "age": "18"})
	users = append(users, map[string]string{"name": "Jerry", "age": "20"})
	users = append(users, map[string]string{"name": "Alice", "age": "22"})

	// 遍历
	for _, user := range users {
		fmt.Println(user)
	}