Golang中使用Map来存储一系列的key/value键值对,可以使用key来对value进行操作(增、删、改、查),map的零值为nil。
介绍
Map 的 key 只能为可使用 ==
运算符的值类型(字符串、数字、bool、数组),value 可以为任何类型。
说明:
- key 需要支持等值运算
- map是无序的,每次遍历的顺序可能都不一样
- 相关函数
map
是线程不安全的,sync.Map 是线程安全的
- map 可以使用
reflect.DeepEqual
比较
示例
基础使用
package main
import (
"fmt"
)
func ExampleMap() {
// 声明
var ages map[string]int
fmt.Printf("%T %#v\n", ages, ages)
fmt.Println(ages == nil) // 默认值为 nil
// 字面值
// ages = map[string]int{} // 定义空map
ages = map[string]int{"xiaowang": 18} // 定义空map
ages["xiaoming"] = 23
fmt.Printf("%T %#v\n", ages, ages)
//ages = make(map[string]int)
//fmt.Printf("%T %#v\n", ages, ages) //map[string]int map[string]int{}
// 操作
fmt.Println(ages["xiaoming"])
fmt.Println(ages["xianbin"]) // 不存在该值,默认为 int 的零值 0
// 查
age, ok := ages["xianbin"] // 判断是否存在,返回两个值,如存在获取 age, true,不存在 0, false
if ok {
fmt.Println(age)
} else {
fmt.Println("not exist")
}
if age, ok := ages["xianbin"]; ok {
fmt.Println(age)
} else {
fmt.Println("not exist")
}
// 改
ages["xiaoming"] = 22
// 增
ages["xianbin"] = 18
fmt.Printf("%T %#v\n", ages, ages)
// 删除
delete(ages, "xianbin")
delete(ages, "bin") // 删除key不存在的值
fmt.Printf("%T %#v\n", ages, ages)
// 获取长度
fmt.Println(len(ages))
// 遍历数组
delete(ages, "xiaoming")
for k, v := range ages {
fmt.Println(k, v)
}
// Output:
//map[string]int map[string]int(nil)
//true
//map[string]int map[string]int{"xiaoming":23, "xiaowang":18}
//23
//0
//not exist
//not exist
//map[string]int map[string]int{"xianbin":18, "xiaoming":22, "xiaowang":18}
//map[string]int map[string]int{"xiaoming":22, "xiaowang":18}
//2
//xiaowang 18
}
说明:
- range map 获取值的情况:
- 获取key, value:
k, v := range map
- 仅获取key:
k := range map
- 初始化如
{"url": ["seo1", "seo2"]}
格式 map:map[string][]string{}
复合使用
package main
import "fmt"
func ExampleMap() {
// 映射的映射
var students map[string]map[string]string
students = map[string]map[string]string{
"xiaoming": {"name": "xiaoming", "age": "18", "sex": "boy"}}
fmt.Printf("%T %#v\n", students, students)
students["xiaowang"] = map[string]string{"name": "xiaowang", "age": "22", "sex": "boy"}
fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])
students["xiaowang"]["age"] = "18"
fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])
fmt.Println(students["bin"] == nil)
if v, ok := students["bin"]; ok {
fmt.Println("bin is exist", v)
} else {
fmt.Println("bin is not exist")
}
// 删除
delete(students["xiaowang"], "age")
fmt.Printf("%T %#v\n", students["xiaowang"], students["xiaowang"])
delete(students, "xiaowang")
fmt.Println(students["xiaowang"] == nil)
// Output:
//map[string]map[string]string map[string]map[string]string{"xiaoming":map[string]string{"age":"18", "name":"xiaoming", "sex":"boy"}}
//map[string]string map[string]string{"age":"22", "name":"xiaowang", "sex":"boy"}
//map[string]string map[string]string{"age":"18", "name":"xiaowang", "sex":"boy"}
//true
//bin is not exist
//map[string]string map[string]string{"name":"xiaowang", "sex":"boy"}
//true
}