一、定义

go 中的Map 类似于 PHP 的数组

Map 是一个无序的集合,遍历的时候没有按固定顺序
Map 使用len获取元素个数


普通的 Mapmap[k]v

package main

import (
    "fmt"
)

func main() {
    m1 := map[string]string{
        "name": "黄先生",
        "age":  "20",
    }
    fmt.Println("m1", m1["name"], m1["age"])
}

复合的 Mapmap[k1]map[k2]v

package main

import (
    "fmt"
)

func main() {
    m2 := map[string]map[string]string{
        "user": {"name": "姓名:黄先生"},
        "shop": {"name": "店铺:水果旗舰店"},
    }
    fmt.Println("m2", m2["user"]["name"], m2["shop"]["name"])
}

使用 make 创建

package main

import (
    "fmt"
)

func main() {
    m3 := make(map[string]string) // m3 = empty map
    fmt.Println("m3", m3, m3 == nil, len(m3) == 0)

    var m4 map[string]string // m4 = nil
    fmt.Println("m4", m4, m4 == nil)
}

运行输出

m3 map[] false true
m4 map[] true
make 创建的是一个空的mapvar 初始化的map 是 一个 nil

二、循环遍历

package main

import (
    "fmt"
)

func main() {
    m1 := map[string]string{
        "name": "黄先生",
        "age":  "20",
    }

    for k, v := range m1 {
        fmt.Println(k, v)
    }
}

运行输出

name 黄先生
age 20

Map 是一个无序的集合,所以每次遍历,输出的结果顺序可能不同
如果需要顺序,只能手工排序,需要取出来放到slice在遍历

for k := range m1 {
    fmt.Println(k)
}

遍历的时候,可以省略 value


三、获取值

package main

import (
    "fmt"
)

func main() {
    m2 := map[string]map[string]string{
        "user": {"name": "黄先生"},
        "shop": {"name": "水果旗舰店"},
    }

    fmt.Println(m2["user"]["name"]);
}

运行输出

黄先生

如果对应的键值不存在,则输出Zero vaule

fmt.Println(m2["user"]["name11"]);

多接收一个参数,判断键值是否存在

username1,ok1 := m2["user"]["name"]
username2, ok2 := m2["user"]["name11"]
fmt.Println(username1, ok1);
fmt.Println(username2 == "", ok2);

if username, ok := m2["user"]["name22"]; ok {
    fmt.Println(username)
}else {
    fmt.Println("key does not exist")
}

运行输出

黄先生 true
true false
key does not exist

四、删除

package main

import (
    "fmt"
)

func main() {
    m2 := map[string]map[string]string{
        "user": {"name": "黄先生"},
        "shop": {"name": "水果旗舰店"},
    }

    delete(m2["user"], "name")
    if username, ok := m2["user"]["name"]; ok {
        fmt.Println(username)
    }else {
        fmt.Println("key does not exist")
    }
}

运行输出

key does not exist