• Go语言学习——map


    map

    • 映射关系容器 内部使用散列表(hash)实现
    • map是引用类型 必须初始化才能使用
    • 无序的基于key-value的数据结构

    map定义

    map的定义语法:

    map[KeyType]ValueType

    其中,

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

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

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

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

    map基本使用

    判断某个键是否存在

    判断map中键是否存在 :

    value, ok := map[key]

    map的遍历

    使用for range遍历map

    使用delete()函数删除键值对

    delete()格式:

    delete(map, key)

    其中,

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

    go doc builtin.delete 查看文档

    package main
    import "fmt"
    // map
    func main(){
    var m1 map[string]int
    fmt.Println(m1==nil) // 还没有初始化(没有在内存中开辟空间)
    m1 = make(map[string]int, 10) // 要估算号该map容量,避免在程序运行期间再动态扩容
    m1["理想"] = 18
    m1["李时珍"] = 35
    fmt.Println(m1)
    fmt.Println(m1["理想"])
    // 约定成俗用OK接收返回的布尔值
    fmt.Println(m1["貂蝉"]) // 0 如果不存在这个key拿到对应值类型的零值
    value, ok := m1["貂蝉"]
    if !ok {
    fmt.Println("查无此key")
    } else {
    fmt.Println(value)
    }
    // map的遍历
    for k, v := range m1 {
    fmt.Println(k, v)
    }
    // 遍历key
    for k := range m1 {
    fmt.Println(k)
    }
    // 只遍历value
    for _, v := range m1 {
    fmt.Println(v)
    }
    // 删除
    delete(m1, "李时珍")
    fmt.Println(m1)
    delete(m1, "李白") // 删除不存在的key
    }

    按照指定顺序遍历map

    package main
    import (
    "fmt"
    "math/rand"
    "sort"
    "time"
    )
    func main() {
    rand.Seed(time.Now().UnixNano()) //初始化随机数种子 当前时间纳秒数
    var scoreMap = make(map[string]int, 200)
    for i := 0; i < 100; i++ {
    key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
    value := rand.Intn(100) //生成0~99的随机整数
    scoreMap[key] = value
    }
    fmt.Println(scoreMap)
    //取出map中的所有key存入切片keys
    var keys = make([]string, 0, 200)
    for key := range scoreMap {
    keys = append(keys, key)
    }
    //对切片进行排序
    sort.Strings(keys)
    //按照排序后的key遍历map
    for _, key := range keys {
    fmt.Println(key, scoreMap[key])
    }
    }

    元素为map类型的切片

    值为切片类型的map

    一定要初始化

    package main
    import "fmt"
    // map和slice组合
    func main(){
    // 元素类型为map的切片
    // var s1 = make([]map[int]string, 0, 10) // 长度为0 内部没有元素
    // var s1 = make([]map[int]string, 1, 10)
    var s1 = make([]map[int]string, 10, 10)
    // 没有对内部的map做初始化
    // s1[0][100] = "A"
    s1[0] = make(map[int]string, 1)
    s1[0][10] = "泰山"
    // fmt.Println(s1) // index out of range [0] with length 0
    // fmt.Println(s1) // panic: assignment to entry in nil map
    fmt.Println(s1) // [map[10:泰山] map[] map[] map[] map[] map[] map[] map[] map[] map[]]
    // 值为切片类型的map
    var m1 = make(map[string][]int, 10)
    m1["北京"] = []int{10, 20, 30}
    fmt.Println(m1)
    }
  • 相关阅读:
    《计算机图形学编程(使用OpenGL和C++)》笔记(1)-前言
    【Rust日报】2023-09-15 RustRover:JetBrains单行版Rust IDE
    MYSQL使用binlog日志恢复数据
    如何优雅的使用MyBatis?
    ubuntu安装MySQL
    java计算机毕业设计家教信息管理系统(附源码、数据库)
    Vue太难啦!从入门到放弃day01——vue基础语法
    spring使用模板模式
    【云原生】设备入云之FlexCloud云端组态实战篇
    力扣 112. 路径总和
  • 原文地址:https://www.cnblogs.com/QiaoPengjun/p/16216733.html