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)

}
相关推荐
skilllite作者2 小时前
SkillLite 架构优化分析报告:项目开发日记
大数据·开发语言·后端·架构·rust·rust沙箱
进击的荆棘2 小时前
C++起始之路——AVL树的实现
开发语言·数据结构·c++·stl·avl
进击的荆棘2 小时前
C++起始之路——红黑树的实现
开发语言·数据结构·c++·stl·红黑树
W.A委员会10 小时前
JS原型链详解
开发语言·javascript·原型模式
止语Lab10 小时前
Go并发编程实战:Channel 还是 Mutex?一个场景驱动的选择框架
开发语言·后端·golang
她说彩礼65万11 小时前
C# 实现简单的日志打印
开发语言·javascript·c#
绿浪198411 小时前
c# 中结构体 的定义字符串字段(性能优化)
开发语言·c#
房开民11 小时前
可变参数模板
java·开发语言·算法
t***54412 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++