今天我们来学习一下Go语言中的Map和它的基本使用。

简介

Go语言中map是为映射关系的容器,它的内部使用的是散列表(hash)来实现的。map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型的,因此使用前需要进行初始化的操作。

定义

语法

Go语言中map定义语法如下:

map[keyType]valueType

说明

  • keyType - 表示键的类型
  • valueType - 表示对应值的类型

map类型默认初始值是nil,需要make()进来内在分配,语法如下:

make(map[keyType]valueType, [cap])

cap为map的容量,是非必须的,但是我们在初始化的过程中尽量先分配一个合适的容量。

基本使用

方式一:先声明后赋值

话不多说,小示例:

func main() {
    scoreMap := make(map[string]int, 3)
    scoreMap["张三"] = 69
    scoreMap["李四"] = 32
    scoreMap["王五"] = 80
    fmt.Println(scoreMap)
    fmt.Println(scoreMap["张三"])
    fmt.Printf("type of is %T, len of is %d\n", scoreMap, len(scoreMap))
}

结果:

map[张三:69 李四:32 王五:80]
69
type of is map[string]int, len of is 3

方式二:声明时赋值

map同样也支持声明的时候进行赋值操作,如下:

func main() {
    userInfo := map[string]string{
        "username": "小明",
        "password": "haha",
    }
    fmt.Println(userInfo)
    fmt.Println(userInfo["username"])
    fmt.Printf("type of is %T, len of is %d\n", userInfo, len(userInfo))
}

结果:

map[password:haha username:小明]
小明
type of is map[string]string, len of is 2

常见的操作

遍历

常规遍历

使用for range进行遍历:

func main() {
    testMap := map[string]string{
        "t01": "1111",
        "t02": "2222",
        "t03": "3333",
        "t04": "4444",
    }

    for key, val := range userInfo {
        fmt.Printf("key is %s, val is %s\n", key, val)
    }
}

结果:

key is t03, val is 3333
key is t04, val is 4444
key is t01, val is 1111
key is t02, val is 2222
从上面的结果中我们可以看出来,map存储时是无序的,如果想按指定顺序进行遍历还是要费点功夫的,下面就来演示一下。

按照顺序遍历

func main() {
    testMap := map[string]string{
        "t01": "1111",
        "t02": "2222",
        "t03": "3333",
        "t04": "4444",
    }

    // 先把map的key放入切片中
    keys := make([]string, 0, len(testMap))
    for key := range testMap {
        keys = append(keys, key)
    }

    // 再对切片进行排序
    sort.Strings(keys)

    // 然后按排好的顺序进行遍历即可
    for _, key := range keys {
        fmt.Printf("key1 is %s, val is %s\n", key, testMap[key])
    }
}

结果:

key1 is t01, val is 1111
key1 is t02, val is 2222
key1 is t03, val is 3333
key1 is t04, val is 4444

判断某个键是否存在

Go语言中有个判断map中键是否存在的语法,格式如下:

value, ok := map[key]

来个小示例看一下它的使用场景吧:

func main() {
    userInfo := map[string]string{
        "username": "小明",
        "password": "haha",
    }

    // 如果key存在,则ok为true,value为对应的值,不存在是ok为false,value为对应值的默认值
    if value, ok := userInfo["username"]; ok {
        fmt.Printf("找到该键对应的值 %v \n", value)
    } else {
        fmt.Println("未找到该键对应的值")
    }
}

删除某个元素

使用delete()内建函数可以删除map中的一组键值中对,格式如下:

delete(map, key)

说明:

  • map - 要删除键值对的map
  • key - 要删除键值对的键名

来个小示例:

func main() {
    userInfo := map[string]string{
        "username": "小明",
        "password": "haha",
    }
  
    // 将username从map中删除
    delete(userInfo, "username")
    fmt.Println(userInfo)
}
至此map相关的东西就差不多了,还有map类型的切片、切片类的map等这些自己探索去吧~