当前位置: 首页 > article >正文

【Go】map数据类型

知识点关键概念
声明 mapvar dict map[string]string(nil)
初始化 mapmake(map[string]string)map[string]string{}
添加/更新元素dict["key"] = "value"
判断 key 是否存在value, ok := dict["key"]
遍历 mapfor k, v := range dict {}
删除元素delete(dict, "key")
嵌套 mapmap[string]map[string]string{}
存储任意类型map[string]interface{}
JSON 互转json.Marshal() / json.Unmarshal()

1. map 的基本概念

代码示例

package main

import "fmt"

func main() {
	// 定义一个 map,key 是 string,value 是 string
	var dict map[string]string // 此时 dict 是 nil,不能直接赋值

	// 需要用 make 初始化
	dict = make(map[string]string)
	dict["hello"] = "你好"
	fmt.Println(dict["hello"]) // 输出: 你好
}

学习笔记

  • map 是一种键值对数据结构,基于哈希表实现,键具有唯一性
  • map 是引用类型,类似于切片(slice),不会存储实际数据,而是指向底层数据结构。
  • map 需要用 make() 进行初始化,否则是 nil,无法使用

2. map 的声明和赋值

代码示例

package main

import "fmt"

func main() {
	// 直接使用 `make` 创建 map
	dict1 := make(map[string]string)
	dict1["Go"] = "Golang"
	fmt.Println(dict1) // map[Go:Golang]

	// 使用字面量初始化 map
	dict2 := map[string]string{
		"China":    "中国",
		"Hunan":    "湖南",
		"Changsha": "长沙",
	}
	fmt.Println(dict2)
}

学习笔记

  • 方式 1:make(map[keyType]valueType, capacity)
    • capacity 不是固定大小,而是初始大小,Go 会自动扩容。
  • 方式 2:map[keyType]valueType{}
    • 直接使用字面量初始化 map,适用于静态数据。

3. 检查 key 是否存在

代码示例

package main

import "fmt"

func main() {
	dict := map[string]string{
		"Go": "Golang",
	}

	// 直接访问 key,如果 key 不存在,会返回 value 类型的零值
	val := dict["Python"]
	fmt.Println("不存在的 key:", val) // ""

	// 使用 `value, ok := dict[key]` 方式检查 key 是否存在
	if v, ok := dict["Go"]; ok {
		fmt.Println("key 存在:", v)
	} else {
		fmt.Println("key 不存在")
	}
}

学习笔记

  • 直接访问 map[key] 时,如果 key 不存在,不会报错,而是返回零值
  • value, ok := map[key] 用于判断 key 是否存在

4. 遍历 map

代码示例

package main

import "fmt"

func main() {
	dict := map[string]string{
		"Go":      "Golang",
		"Python":  "Py",
		"Java":    "JVM",
	}

	// 遍历 key 和 value
	for k, v := range dict {
		fmt.Println(k, "--->", v)
	}

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

学习笔记

  • range 可以用于遍历 map,每次返回 key, value
  • 如果只需要 key,可以省略 value

5. 删除 map 中的元素

代码示例

package main

import "fmt"

func main() {
	dict := map[string]string{
		"Go":      "Golang",
		"Python":  "Py",
		"Java":    "JVM",
	}

	// 删除 key
	delete(dict, "Python")

	// 再次访问 Python,返回空字符串
	fmt.Println(dict["Python"]) // ""
	fmt.Println(dict)
}

学习笔记

  • delete(map, key) 删除 map 中的 key
  • 如果 key 不存在,delete() 也不会报错

6. map 的嵌套(map 套 map)

代码示例

package main

import "fmt"

func main() {
	// map 中嵌套 map
	UserInfo := map[string]map[string]string{
		"root": {
			"password": "123456",
			"role":     "admin",
		},
		"user1": {
			"password": "abc123",
			"role":     "guest",
		},
	}

	fmt.Println(UserInfo)
	fmt.Println(UserInfo["root"]["password"]) // 123456
}

学习笔记

  • map 允许嵌套 map,适用于存储复杂结构的数据。

7. map 与空接口(interface{}

代码示例

package main

import "fmt"

func main() {
	// map 的 value 是 `interface{}`,可以存储任意类型
	emptyMap := map[string]interface{}{
		"name": "Alice",
		"age":  25,
	}

	fmt.Println(emptyMap["age"]) // 25
	fmt.Printf("类型: %T\n", emptyMap["age"]) // int

	// 类型断言
	age := emptyMap["age"].(int)
	fmt.Println("年龄+2:", age+2) // 27
}

学习笔记

  • interface{} 允许存储任意类型的值
  • 使用 .(type) 进行类型断言,否则不能直接使用 interface{} 的值

8. map 与 JSON 互转

代码示例

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// map 转 JSON
	UserInfo := map[string]string{
		"username": "Alice",
		"email":    "alice@example.com",
	}

	jsonStr, err := json.Marshal(UserInfo)
	if err != nil {
		fmt.Println("转换失败:", err)
	} else {
		fmt.Println("JSON:", string(jsonStr))
	}

	// JSON 转 map
	jsonData := `{"a":1,"b":2}`
	dataMap := map[string]int{}
	err = json.Unmarshal([]byte(jsonData), &dataMap)
	if err != nil {
		fmt.Println("转换失败:", err)
	} else {
		fmt.Println("map:", dataMap)
	}
}

学习笔记

  • json.Marshal(map) 可将 map 转换为 JSON
  • json.Unmarshal([]byte, &map) 解析 JSON 成 map

http://www.kler.cn/a/597150.html

相关文章:

  • React 中的错误边界(Error Boundaries),如何使用它们捕获组件错误
  • Java 之「单调栈」:从入门到实战
  • 专访成都昭音科技Jackal:AI内容营销助力中企走向全球
  • AndroidFramework 生成 ota_update.zipadb验证OTA
  • JAVA学习*内部类
  • 通过webrtc+canvas+css实现简单的电脑滤镜拍照效果
  • 告别 ResultSet 的烦恼:使用 Apache DBUtils 和 ArrayList 优化数据管理
  • 机器学习knnlearn1
  • 嵌入式硬件工程师从小白到入门-原理图(三)
  • YOLO编程:开启计算机视觉的神奇之门
  • 我被AI骗了—关于CAN总线填充机制的回答
  • AWS中通过Endpoint Security(如Amazon GuardDuty)与安全组、网络ACL联动实现协同防御
  • 【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证
  • ci如何做才能做到每秒rps 为3000+
  • Doris性能优化建议
  • 失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)
  • 【JavaEE进阶】部署Web项目到Linux服务器
  • shell流程控制
  • 操作系统导论——第13章 抽象:地址空间
  • Python网络编程入门