go Map

map 是 Go 语言中 ** 键值对(key-value)** 存储的数据结构,类似其他语言的字典、哈希表,查询、插入、删除速度极快,是 Go 最常用的数据类型之一。

一、特性

  1. key 必须唯一 ,且必须是可比较类型(int/string/float/bool 等,slice/map/function 不能做 key)
  2. value 无限制,可以是任意类型
  3. 无序存储,遍历顺序不固定
  4. 零值是 nil,nil map 不能直接赋值,必须先初始化
  5. 支持自动扩容,无需手动管理容量

二、map 的创建(4 种常用方式)

1. 声明 + 初始化(推荐)

复制代码
// 方式1:make 函数(最常用)
var m map[string]int = make(map[string]int)
// 简写
m := make(map[string]int)

// 带初始容量(提升性能,避免频繁扩容)
m := make(map[string]int, 10)

2. 直接初始化(带初始值)

复制代码
// 声明时直接赋值
m := map[string]string{
    "name": "张三",
    "age":  "20",
}

3. 声明空 map

复制代码
m := map[string]int{}

4. 错误示范(nil map 不能赋值)

复制代码
// 错误:只声明不初始化,是 nil map,赋值会 panic
var m map[string]int
m["key"] = 100 // panic: assignment to entry in nil map

三、map 基本操作

1. 增 / 改元素

复制代码
m := make(map[string]int)
// 新增
m["语文"] = 90
m["数学"] = 95

// 修改(key 已存在则覆盖)
m["语文"] = 98

2. 查询元素

复制代码
// 直接取值
score := m["语文"]
fmt.Println(score) // 98

// 安全取值:判断 key 是否存在(重要!)
score, ok := m["英语"]
if ok {
    fmt.Println("分数:", score)
} else {
    fmt.Println("该科目不存在")
}

3. 删除元素

使用内置函数 delete()

复制代码
delete(m, "数学") // 删除 key=数学 的键值对

4. 遍历 map

复制代码
m := map[string]int{"语文": 98, "数学": 95}

// 遍历 key + value
for k, v := range m {
    fmt.Println(k, v)
}

// 只遍历 key
for k := range m {
    fmt.Println(k)
}

5. 获取 map 长度

复制代码
fmt.Println(len(m)) // 2

四、高级用法

1. map 的 value 是切片

复制代码
// key:string,value:[]int
m := make(map[string][]int)
m["成绩"] = []int{90, 95, 88}

2. map 的 value 是 map

复制代码
// 嵌套 map
m := make(map[string]map[string]int)
m["学生A"] = map[string]int{"语文": 90}

3. 函数传参(引用传递)

map 是引用类型 ,函数内修改会直接影响原 map,无需指针:

复制代码
func update(m map[string]int) {
    m["数学"] = 100 // 直接修改原 map
}

func main() {
    m := map[string]int{"数学": 95}
    update(m)
    fmt.Println(m) // map[数学:100]
}

示例

复制代码
package main

import "fmt"

func main() {
	// 1.创建map
	student := make(map[string]string)

	// 2.赋值
	student["name"] = "李四"
	student["gender"] = "男"
	student["age"] = "22"

	// 3.查询
	name, ok := student["name"]
	if ok {
		fmt.Println("姓名:",name)
	}

	gender, ok := student["gender"]
	if ok {
		fmt.Println("性别:",gender)
	}

	age, ok := student["age"]
	if ok {
		fmt.Println("年龄:",age)
	}


	// 4.遍历
	fmt.Println("\n全部信息")
	for k, v := range student{
		fmt.Println("%s: %s\n", k, v)
	}

	// 5.删除
	delete(student, "age")
	fmt.Println("\n删除后的map:", student)

}
相关推荐
weixin_3077791339 分钟前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天4 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071575 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/6 小时前
5.java-数组
java·开发语言
Java后端的Ai之路6 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang7 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人7 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程