概述

Map 是一种键值对的无序汇合,在其余编程语言中也被称为 字典, Hash, 关联数组

重要的一点是: Map 键 的数据类型必须是能够比拟的,例如 string, int, float64
类型比拟能够参考这篇文档 。

Map 值 的数据类型能够是任意的。

语法规定

# 申明var 变量名 map[键数据类型]值数据类型# 申明及初始化var 变量名 = make(map[键数据类型]值数据类型, 长度)   // 长度参数能够省略

获取值/扭转值

package mainimport "fmt"func main() {    var m = make(map[string]int)    fmt.Printf("Map 长度 = %d\n", len(m))    m["zero"] = 0    m["one"] = 1    m["two"] = 2    fmt.Printf("Map 长度 = %d\n", len(m))    fmt.Printf("zero = %T, %v\n", m["zero"], m["zero"])    fmt.Printf("one = %T, %v\n", m["one"], m["one"])    fmt.Printf("two = %T, %v\n", m["two"], m["two"])}// $ go run main.go// 输入如下 /**  Map 长度 = 0  Map 长度 = 3  zero = int, 0  one = int, 1  two = int, 2*/

删除元素

调用 delete() 办法实现。

package mainimport "fmt"func main() {    var m = make(map[string]int)    fmt.Printf("Map 长度 = %d\n", len(m))    m["zero"] = 0    m["one"] = 1    m["two"] = 2    fmt.Printf("Map 长度 = %d\n", len(m))    delete(m, "one")    delete(m, "two")    fmt.Printf("Map 长度 = %d\n", len(m))}// $ go run main.go// 输入如下 /**  Map 长度 = 0  Map 长度 = 3  Map 长度 = 1*/

判断元素是否存在

package mainfunc main() {    var m = make(map[string]int)    m["zero"] = 0    m["one"] = 1    m["two"] = 2    if _, ok := m["zero"]; ok {        println(`m["zero"] 元素存在`)    }    delete(m, "zero")    if _, ok := m["zero"]; !ok {        println(`m["zero"] 元素不存在`)    }}// $ go run main.go// 输入如下 /**  m["zero"] 元素存在  m["zero"] 元素不存在*/

遍历 Map

重要的一点是: Map 遍历是无序的。 所以不能依赖于遍历的程序,不论是 还是
如果须要遍历时永远放弃雷同的程序,须要提前将 做排序解决,参考 有序 Map 大节。

package mainimport "fmt"func main() {    var m = make(map[string]int)    m["zero"] = 0    m["one"] = 1    m["two"] = 2    for k, v := range m {        fmt.Printf("key = %s, val = %d\n", k, v)    }    println("\n遍历 3 次,每次输入的后果可能不一样\n")    for i := 0; i < 3; i++ {        for k, v := range m {            fmt.Printf("key = %s, val = %d\n", k, v)        }        fmt.Printf("第 %d 次遍历实现\n\n", i+1)    }}// $ go run main.go// 输入如下 /**  key = zero, val = 0  key = one, val = 1  key = two, val = 2  遍历 3 次,每次输入的后果可能不一样  key = one, val = 1  key = two, val = 2  key = zero, val = 0  第 1 次遍历实现  key = zero, val = 0  key = one, val = 1  key = two, val = 2  第 2 次遍历实现  key = one, val = 1  key = two, val = 2  key = zero, val = 0  第 3 次遍历实现*/

备注: 你的输入应该和这里不一样,多运行几次,看看是否每次都不一样。

并发不平安

最初要阐明的很重要的一点是: Map 不是并发平安的, 也就是说,如果在多个线程中,同时对一个 Map 进行读写,会报错。
互斥锁 提供了一个简略的解决方案,前面会专门写一篇文档来阐明如何能力 并发平安

分割我