Go基础之Map~

55 阅读2分钟

一、Map

1、Map的定义

在Go中,提供了一种映射关系的容器类型`map`,其内部实现为散列表(hash)。`map`是一种无序且基于`key-value`的数据类型,且`key``map`中只能够出现一次。`map`属于引用类型,需要初始化后才能够使用。

map的定义如下:

map[键类型]值类型
  • 键类型:表示map中键的数据类型
  • 值类型:表示map中键对应的值数据类型

map类型的变量默认初始化为nil,在使用map前,需要使用make()函数来分配内存初始化。使用make的语法如下:

make(map[键类型]值类型, [cap])

上述表达式中,cap表示map的容量,该参数不是必填参数,但在初始化map时,应该为其指定一个合适的容量。

2、Map的使用

(1)基本使用

在使用make初始化一个map后,可以为map添加对应类型的键值。

func main() {
    m := make(map[string]int, 10)
    m["Go"] = 100
    m["Java"] = 90
    fmt.Println(m)             // map[Go:100 Java:90]
    fmt.Println(m["Go"])       // 100
    fmt.Printf("m的类型:%T\n", m) // map[Go:100 Java:90]
}

另外,map也支持在声明时添加键值对。例如:

func main() {
    userInfo := map[string]string{
       "username": "serena",
       "password": "123456",
    }
    fmt.Println(userInfo) // map[password:123456 username:serena]
}

(2)键是否存在

在使用map时,如果需要判断某个键是否存在,则可以使用如下格式:

value, ok := map[key]

例如:

func main() {
    searchMap := map[string]string{
       "Go":   "Go",
       "Java": "Java",
    }
    if value, ok := searchMap["Go"]; ok {
       fmt.Println(value) // Go
    } else {
       fmt.Println("未检索到该键值")
    }
}

(3)遍历

map可以通过for range实现map中键值的遍历

func main() {
    searchMap := make(map[string]string)
    searchMap["Go"] = "Go"
    searchMap["Java"] = "Java"
    searchMap["MySQL"] = "MySQL"
    for k, v := range searchMap {
       fmt.Printf("key: %s, value: %s\n", k, v)
    }
}
// 执行结果
key: Java, value: Java
key: MySQL, value: MySQL
key: Go, value: Go

上述代码通过使用for range对map进行遍历,从执行结果可以看出,遍历map时的元素顺序与添加键值对的顺序无关。

(4)删除键值对

在Go中提供了内置函数delete(),该函数可以从map中删除键值对,delete()的使用如下:

delete(map, key)
  • map:需要删除键值对的map
  • key:需要删除键值对的键值

例如:

func main() {
    searchMap := make(map[string]string)
    searchMap["Go"] = "Go"
    searchMap["Java"] = "Java"
    searchMap["MySQL"] = "MySQL"

    delete(searchMap, "MySQL")
    for k, v := range searchMap {
       fmt.Printf("key: %s, value: %s\n", k, v)
    }
}

// 执行结果
key: Go, value: Go
key: Java, value: Java