转载

【Golang 基础】Go 语言的 Map

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
}

Mapkey 必须是支持 ==!= 比较运算符的数据类型。

  • 通过使用 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]
}
原文  https://studygolang.com/articles/19313
正文到此结束
Loading...