go Map

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

一、特性

  1. key 必须唯一 ,且必须是可比较类型(int/string/float/bool 等,slice/map/function 不能做 key
  2. value 无限制,可以是任意类型
  3. 无序存储,遍历顺序不固定
  4. 零值是 nilnil 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)

}
相关推荐
西门吹-禅38 分钟前
java springboot N+1问题
java·开发语言·spring boot
skywalk81631 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
IT笔记2 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode3 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇3 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas3 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
敲代码的嘎仔4 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森4 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.4 小时前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
老迟到的茉莉5 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python