Go 语言中的Map
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
的取值
可以直接通过 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]
}
有疑问加站长微信联系(非本文作者)