Map
是一个无序的键值对数据集合,通过 key
快速检索数据。
map[keyType]valueType
格式声明 Map
; package basic import "fmt" func DeclaratMap(){ // 声明一个空的 map m1 := map[int]string{} fmt.Println(m1) // map[] // 声明一个 map 并赋初始值 m2 := map[int]string{ 0: "Java", 1: "C#", 2: "Python", 3: "Golang" } fmt.Println(m2) // map[3:Golang 0:Java 1:C# 2:Python] }
make(map[keyType]ValueType, cap)
格式声明 Map
;
其中 cap
表示容量,可以省略,当 Map
超过设置的容量时,会自动扩展
; package basic import "fmt" func DeclaratMapByMake() { m := make(map[int]string, 3) m[0] = "Java" m[1] = "C#" m[2] = "Python" fmt.Println(m, len(m)) // map[1:C# 2:Python 0:Java] 3 m[3] = "Golang" fmt.Println(m, len(m)) // map[0:Java 1:C# 2:Python 3:Golang] 4 }
Map
的 key
必须是支持 ==
或 !=
比较运算符的数据类型。
for range
遍历 Map
; func TraverseMap() { m2 := map[int]string{0: "Java", 1: "C#", 2: "Python", 3: "Golang"} for key, value := range m2 { fmt.Println(key, ":", value) } }
Map
是支持嵌套的,但是需要对嵌套后的 Map
进行初始化; func NestedMap() { var array = [...]string{"Java", "C#", "Python", "Golang"} // 声明一个 嵌套 map 父级 key 类型为 int,value 为map m := make(map[int]map[string]int) for i, value := range array { // 判断嵌套的 map 是否初始化 _, isMake := m[i][value] if !isMake { // 对嵌套的 map 初始化 m[i] = make(map[string]int) } m[i][value] = i } fmt.Println(m) // map[0:map[Java:0] 1:map[C#:1] 2:map[Python:2] 3:map[Golang:3]] }
Map
的取值
可以直接通过 map[key]
的方式取 Map
中的值,当 key
值不存在时,则会返回一个 value
的初始值;
func GetMapValue() { m1 := map[string]int{"Golang": 20, "Java": 30, "C#": 40} fmt.Println(m1["Python"]) // 0 }
那么问题来了,如果我们想要通过用户提供的 key
获取的值做判断, key
如果不存在,则添加,该如何判断呢?
实际上, map[key]
有两个返回值,一个是根据 key
返回的值,另一个则是用于判断 key
是否存在
func GetMapValue() { m1 := map[string]int{"Golang": 20, "Java": 30, "C#": 40} if _, isExist := m1["Python"]; !isExist { m1["Python"] = 10 } fmt.Println(m1) // map[C#:40 Python:10 Golang:20 Java:30] }
Map
中的数据
使用 delete(map, key)
方法删除 Map
中的数据;
func DeleteMapData(){ m1 := map[string]int{"Golang": 20, "Java": 30, "C#": 40} fmt.Println(m1) // map[Golang:20 Java:30 C#:40] delete(m1, "Java") fmt.Println(m1) // map[Golang:20 C#:40] }