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)

}
相关推荐
希望永不加班14 小时前
Java数据类型陷阱:int和Integer的7个关键区别
java·开发语言
The Chosen One98514 小时前
【Linux】深入理解Linux进程(二):进程的状态
linux·运维·服务器·开发语言·git
嵌入式小杰14 小时前
一阶低通滤波入门教程:从原理到单片机 C 代码实现
c语言·开发语言·stm32·单片机·算法
叼烟扛炮14 小时前
C++ 知识点02 输入输出
开发语言·c++·算法·输入输出
qcx2314 小时前
深度解析Deepseek V4:1M 上下文不是军备竞赛,是养 Agent 的人才知道的痛
java·开发语言
小此方14 小时前
Re:思考·重建·记录 现代C++ C++11篇(六) 从 shared_ptr 到 weak_ptr:起底智能指针的引用计数与循环引用之痛
开发语言·c++·c++11·现代c++
晨非辰14 小时前
吃透C++两大默认成员函数:const成员函数、 & 取地址运算符重载
java·大数据·开发语言·c++·人工智能·后端·面试
我滴老baby14 小时前
多智能体协作系统设计当AI学会团队合作效率翻十倍
android·开发语言·人工智能
落雪寒窗-15 小时前
Python进阶核心路线(工程向)
开发语言·python
humcomm15 小时前
全栈开发技术栈的最新进展(2026年视角)
开发语言·架构