美文网首页
12. Go语言基础之map

12. Go语言基础之map

作者: 神奇作手 | 来源:发表于2020-12-08 11:37 被阅读0次

前言

Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。
map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

12.1 map定义

map的定义语法如下:

map[KeyType]ValueType

其中:

  • KeyType:表示键的类型。
  • ValueType:表示键对应的值的类型。

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

make(map[KeyType]ValueType, [cap])

其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。

12.2 map基本使用

map中的数据都是成对出现的。

(1)使用make创建map数据类型

func main() {
    scoreMap := make(map[string]int, 8) // 容量8可以不指定
    scoreMap["小五"] = 90
    scoreMap["小六"] = 100
    fmt.Println(scoreMap)
    fmt.Println(scoreMap["小五"])
    fmt.Printf("type of a:%T\n", scoreMap)
}

输出:

map[小六:100 小五:90]
90
type of a:map[string]int

(2)map也支持声明的时候填充元素

func main() {
    userInfo := map[string]string{
        "username": "挂傍山小六",
        "password": "123456",
    }
    fmt.Println(userInfo) 
}

12.3 判断键是否存在

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

value, ok := map[key]

例子:

func main() {
    scoreMap := make(map[string]int)
    scoreMap["小五"] = 90
    scoreMap["小六"] = 100
    // 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
    v, ok := scoreMap["小五"]
    if ok {
        fmt.Println(v)
    } else {
        fmt.Println("查无此人")
    }
}

如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值

12.4 map的遍历

使用for range遍历map,如下:

func main() {
    scoreMap := make(map[string]int)
    scoreMap["小五"] = 90
    scoreMap["小六"] = 100
    scoreMap["小七"] = 60
    for k, v := range scoreMap {
        fmt.Println(k, v)
    }
}

\color{red}{注意:} 遍历map时的元素顺序与添加键值对的顺序无关。

12.5 map中删除键-值对

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

delete(map, key)

其中:

  • map:表示要删除键值对的map
  • key:表示要删除的键值对的键

如下实例:

func main(){
    scoreMap := make(map[string]int)
    scoreMap["小五"] = 90
    scoreMap["小六"] = 100
    scoreMap["小七"] = 60
    delete(scoreMap, "小七")//将小七:100从map中删除
    for k,v := range scoreMap{
        fmt.Println(k, v)
    }
}

12.6 元素为map类型的切片

切片中的元素为map类型时的操作:

func main() {
    var mapSlice = make([]map[string]string, 3)
    for index, value := range mapSlice {
        fmt.Printf("index:%d value:%v\n", index, value)
    }
    fmt.Println("after init")
    // 对切片中的map元素进行初始化
    mapSlice[0] = make(map[string]string, 10)
    mapSlice[0]["name"] = "小六"
    mapSlice[0]["password"] = "123456"
    mapSlice[0]["address"] = "挂傍山"
    for index, value := range mapSlice {
        fmt.Printf("index:%d value:%v\n", index, value)
    }
}

12.7 值为切片类型的map

map中值为切片类型的操作:

func main() {
    var sliceMap = make(map[string][]string, 3)
    fmt.Println(sliceMap)
    fmt.Println("after init")
    key := "中国"
    value, ok := sliceMap[key]
    if !ok {
        value = make([]string, 0, 2)
    }
    value = append(value, "北京", "上海")
    sliceMap[key] = value
    fmt.Println(sliceMap)
}

相关文章

  • 12. Go语言基础之map

    前言 Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。map是一种无序的基于key-val...

  • 10.map

    Go语言基础之map | Golang Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现。 ...

  • Go语言基础之map

  • Go语言高并发Map解决方案

    Go语言高并发Map解决方案 Go语言基础库中的map不是并发安全的,不过基于读写锁可以实现线程安全;不过在Go1...

  • Go语言探索 - 11(原创)

    Go语言基础系列博客用到的所有示例代码 上一篇文章主要学习了Go语言的切片以及Map。本篇文章主要学习的是Go语言...

  • Go 语言基础--map 浅析

    map通常是一种无序键值对的集合,map存在的意义主要是利用map的结构根据key来快速检索数据,在go中也是这样...

  • 第九章:Go语言映射类型map

    1. map概述 Go语言中map字典类型时散列表(hash table)的实现,因为Go语言中将map中的每个键...

  • Go语言——Map分析

    Go语言——Map分析 go\src\runtime\hashmap.go 简介 map就是一个hash表。数据被...

  • go语言学习总结

    1、go语言的map和c++中的map有什么区别? go语言中的map是hash_table,和c++中uno...

  • Golang之Map源码

    引用 深入 Go 的 Map 使用和实现原理 哈希表 深度解密Go语言之map Golang map 的底层实现 使用

网友评论

      本文标题:12. Go语言基础之map

      本文链接:https://www.haomeiwen.com/subject/xgdewktx.html