Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【Golang 基础】Go 语言的 Map #51

Open
SilenceHVK opened this issue Oct 9, 2018 · 0 comments
Open

【Golang 基础】Go 语言的 Map #51

SilenceHVK opened this issue Oct 9, 2018 · 0 comments
Labels

Comments

@SilenceHVK
Copy link
Owner

SilenceHVK commented Oct 9, 2018

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]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant