【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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值