GO---map函数

一、map 基本概念

  1. 定义 :Go 语言中的map键值对(key-value) 存储结构,也叫映射

  2. 核心特性

    • 存储无序的键值对
    • 键(key)必须是唯一的,重复赋值会覆盖旧值
    • 只有len()长度,没有 cap 容量
    • 键的类型限制:函数、切片、map 不能作为 key(必须支持 == 比较)
  3. 语法格式

    go

    Go 复制代码
    // 声明格式:map [键类型]值类型
    var 变量名 map[keyType]valueType

二、map 的 3 种创建方式

1. 直接初始化(声明 + 赋值)

go

Go 复制代码
// 键int类型,值string类型
info := map[int]string{
	111: "mike",
	110: "yoyo", // 最后一行逗号不能省略(Go语法要求)
}

2. 仅声明(未初始化,不能直接赋值)

go

Go 复制代码
// 仅定义类型,未分配内存,值为nil
var m1 map[int]string
// 注意:直接赋值 m1[1] = "test" 会报错!

3. make 函数创建(推荐,分配内存)

go

Go 复制代码
// 方式1:不指定长度
m2 := make(map[int]string)

// 方式2:指定初始长度(优化性能,底层仍可自动扩容)
m3 := make(map[int]string, 2)

三、map 常用操作

1. 赋值与追加

map 支持直接赋值,不存在的 key 会自动追加,底层自动扩容

go

Go 复制代码
// 初始化map
m := map[int]string{1: "mike", 2: "yoyo"}

// 修改已有key的值
m[1] = "c++"

// 追加新key-value
m[3] = "go"

2. 遍历 map

使用for range遍历,结果无序,支持只遍历 key / 只遍历 value

go

Go 复制代码
m := map[int]string{1: "mike", 2: "yoyo", 3: "go"}

// 遍历key和value
for key, value := range m {
	fmt.Printf("%d ======》 %s\n", key, value)
}

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

// 只遍历value
for _, value := range m {
	fmt.Println("value:", value)
}

3. 判断 key 是否存在

通过双返回值判断 key 是否存在,避免获取零值误判

go

Go 复制代码
m := map[int]string{1: "mike"}

// value:key对应的值(不存在则为类型零值)
// ok:bool类型,true=key存在,false=key不存在
value, ok := m[0]
if ok {
	fmt.Println("key存在,值为:", value)
} else {
	fmt.Println("key不存在")
}

4. 删除元素

使用内置函数delete(map, key),删除不存在的 key不会报错

go

Go 复制代码
m := map[int]string{1: "mike", 2: "yoyo"}

// 删除key=1的键值对
delete(m, 1)

// 删除不存在的key,无异常
delete(m, 100)

四、map 作为函数参数

map 是引用类型,函数内部修改 map(增删改),会影响外部原 map

go

Go 复制代码
package main

import "fmt"

// map作为函数参数
func test(m map[int]string) {
	delete(m, 1) // 函数内删除key
}

func main() {
	m := map[int]string{1: "mike", 2: "yoyo"}
	test(m)
	fmt.Println(m) // 输出:map[2:yoyo],原map被修改
}

五、核心易错点总结

  1. 仅声明未用make初始化的 map(nil map),不能直接赋值
  2. map 键必须唯一,重复赋值会覆盖旧值
  3. 遍历 map无序,不能依赖遍历顺序
  4. map 是引用类型,函数传参是传引用,会修改原数据
  5. delete()函数删除不存在的 key,不会触发错误

总结

  1. map 是无序键值对,key 唯一、支持自动扩容,无容量限制
  2. 三种创建方式:直接初始化、仅声明、make 创建(推荐)
  3. 核心操作:赋值、遍历、判断 key 存在、delete 删除
  4. map 是引用类型,函数内修改会同步到外部原 map
相关推荐
林深见鹿_海蓝见鲸几秒前
微信小程序反编译完整教程(Windows 新手版)
前端
n8n几秒前
Java 21 虚拟线程(Virtual Threads)
后端
默_笙17 分钟前
😋 我让爬虫终于看到了我的网站,后端同事说"这也行?"(上):SEO 与渲染模式
前端·javascript
Csvn19 分钟前
🐍 Day 5: Python 函数详解 — 参数、作用域与一等公民
人工智能·后端
wno70426 分钟前
Spring Boot中使用Servlet
spring boot·后端·servlet
老郑聊AI业财智造33 分钟前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
程序员与背包客_CoderZ35 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
省长39 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
feixing_fx40 分钟前
告别枯燥字体:Web 字体加载策略与 font-display 最佳实践
前端·css·前端框架·交互·css3
MetaLite41 分钟前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端