知识点 | 关键概念 |
---|
声明 map | var dict map[string]string (nil) |
初始化 map | make(map[string]string) 或 map[string]string{} |
添加/更新元素 | dict["key"] = "value" |
判断 key 是否存在 | value, ok := dict["key"] |
遍历 map | for k, v := range dict {} |
删除元素 | delete(dict, "key") |
嵌套 map | map[string]map[string]string{} |
存储任意类型 | map[string]interface{} |
JSON 互转 | json.Marshal() / json.Unmarshal() |
1. map
的基本概念
代码示例
package main
import "fmt"
func main() {
var dict map[string]string
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() {
dict1 := make(map[string]string)
dict1["Go"] = "Golang"
fmt.Println(dict1)
dict2 := map[string]string{
"China": "中国",
"Hunan": "湖南",
"Changsha": "长沙",
}
fmt.Println(dict2)
}
学习笔记
- 方式 1:
make(map[keyType]valueType, capacity)
capacity
不是固定大小,而是初始大小,Go 会自动扩容。
- 方式 2:
map[keyType]valueType{}
3. 检查 key
是否存在
代码示例
package main
import "fmt"
func main() {
dict := map[string]string{
"Go": "Golang",
}
val := dict["Python"]
fmt.Println("不存在的 key:", val)
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",
}
for k, v := range dict {
fmt.Println(k, "--->", v)
}
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",
}
delete(dict, "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() {
UserInfo := map[string]map[string]string{
"root": {
"password": "123456",
"role": "admin",
},
"user1": {
"password": "abc123",
"role": "guest",
},
}
fmt.Println(UserInfo)
fmt.Println(UserInfo["root"]["password"])
}
学习笔记
map
允许嵌套 map
,适用于存储复杂结构的数据。
7. map
与空接口(interface{}
)
代码示例
package main
import "fmt"
func main() {
emptyMap := map[string]interface{}{
"name": "Alice",
"age": 25,
}
fmt.Println(emptyMap["age"])
fmt.Printf("类型: %T\n", emptyMap["age"])
age := emptyMap["age"].(int)
fmt.Println("年龄+2:", age+2)
}
学习笔记
interface{}
允许存储任意类型的值。- 使用
.(type)
进行类型断言,否则不能直接使用 interface{}
的值。
8. map
与 JSON 互转
代码示例
package main
import (
"encoding/json"
"fmt"
)
func main() {
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))
}
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
。