章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • python

  • shell

  • go

    • go基础

      • 指针
      • 数组
      • 切片
      • 字典
        • 结构体
        • 匿名组合
        • 方法
        • 接口
        • error接口
        • panic使用
      • Init函数和main函数
      • 下划线
      • go报错问题收集
      • Redis和MySQL结合的Web服务示例
      • go定义json数据
      • 使用go和vue编写学生管理系统
      • gin框架探索
    • 编程
    • go
    • go基础
    章工运维
    2024-11-14
    目录

    字典

    在Go语言中,字典(称为map)是一种键值对的数据结构,它提供了高效的键值对查找。字典在很多场景下都非常有用,例如存储和快速查找数据、计数、分组等。

    # 1. 字典的定义和初始化

    # 1.1 使用make函数创建字典

    在Go中,可以使用make函数创建字典。字典的键和值的数据类型是固定的,例如map[string]int表示键为字符串,值为整数的字典。

    // 创建一个键为字符串、值为整数的字典
    ages := make(map[string]int)
    
    1
    2

    # 1.2 使用字面量创建字典

    可以直接使用字面量初始化字典。

    // 使用字面量创建并初始化字典
    ages := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }
    fmt.Println(ages) // 输出: map[Alice:25 Bob:30]
    
    1
    2
    3
    4
    5
    6

    # 2. 字典的基本操作

    # 2.1 添加或更新元素

    可以通过指定键来添加或更新字典的值。

    ages := make(map[string]int)
    ages["Alice"] = 25  // 添加一个键值对
    ages["Bob"] = 30    // 添加另一个键值对
    ages["Alice"] = 26  // 更新键"Alice"的值
    fmt.Println(ages)   // 输出: map[Alice:26 Bob:30]
    
    1
    2
    3
    4
    5

    # 2.2 获取元素

    可以通过键来获取字典中的值。

    age := ages["Alice"]
    fmt.Println(age) // 输出: 26
    
    1
    2

    # 2.3 检查键是否存在

    获取值时,可以使用两个返回值的语法来检查键是否存在。第二个返回值是布尔类型,表示键是否存在。

    age, exists := ages["Alice"]
    if exists {
        fmt.Println("Alice的年龄:", age)
    } else {
        fmt.Println("Alice不存在")
    }
    
    1
    2
    3
    4
    5
    6

    # 2.4 删除元素

    可以使用delete函数从字典中删除指定键的元素。

    delete(ages, "Bob")
    fmt.Println(ages) // 输出: map[Alice:26]
    
    1
    2

    # 3. 遍历字典

    可以使用for range循环遍历字典中的所有键值对。

    ages := map[string]int{"Alice": 25, "Bob": 30, "Charlie": 35}
    for name, age := range ages {
        fmt.Printf("%s的年龄是%d\n", name, age)
    }
    
    1
    2
    3
    4

    # 4. 字典的长度

    使用len函数可以获取字典中键值对的数量。

    fmt.Println(len(ages)) // 输出字典中的键值对数量
    
    1

    # 5. 字典的常见应用

    # 5.1 统计词频

    字典可以用于统计字符或单词出现的次数。

    text := "hello world"
    freq := make(map[rune]int)
    for _, char := range text {
        freq[char]++
    }
    fmt.Println(freq) // 输出: map[h:1 e:1 l:3 o:2 w:1 r:1 d:1]
    
    1
    2
    3
    4
    5
    6

    # 5.2 分组数据

    字典可以用于分组数据,例如按类别或属性分组。

    people := []struct {
        Name string
        Age  int
    }{
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 25},
    }
    
    ageGroups := make(map[int][]string)
    for _, person := range people {
        ageGroups[person.Age] = append(ageGroups[person.Age], person.Name)
    }
    fmt.Println(ageGroups) // 输出: map[25:[Alice Charlie] 30:[Bob]]
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # 5.3 实现集合

    字典可以模拟集合,用来存储不重复的元素。

    uniqueNames := make(map[string]bool)
    names := []string{"Alice", "Bob", "Alice", "Charlie"}
    for _, name := range names {
        uniqueNames[name] = true
    }
    
    for name := range uniqueNames {
        fmt.Println(name) // 输出唯一的名字
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 6. 字典的嵌套使用

    字典可以嵌套使用,例如字典的值可以是另一个字典。

    students := map[string]map[string]int{
        "Alice":   {"Math": 90, "English": 85},
        "Bob":     {"Math": 70, "English": 80},
        "Charlie": {"Math": 85, "English": 88},
    }
    
    fmt.Println(students["Alice"]["Math"]) // 输出: 90
    
    1
    2
    3
    4
    5
    6
    7

    # 7. 判断字典是否为空

    要判断字典是否为空,可以检查其长度是否为0。

    if len(ages) == 0 {
        fmt.Println("字典是空的")
    }
    
    1
    2
    3

    # 8. 字典的并发安全性

    在Go中,字典不是并发安全的。如果多个goroutine会同时访问字典,建议使用sync.Map或添加锁(例如sync.RWMutex)来保证并发安全。

    // 使用sync.Map实现并发安全的字典
    var syncMap sync.Map
    
    // 存储键值对
    syncMap.Store("Alice", 25)
    
    // 加载键值对
    age, _ := syncMap.Load("Alice")
    fmt.Println(age) // 输出: 25
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    # 总结

    字典(map)是Go中常用的数据结构,特别适合用于键值对数据的存储和快速查找。通过掌握字典的基本用法和应用场景,可以高效地处理数据。

    微信 支付宝
    上次更新: 2024/11/14, 16:29:25

    ← 切片 结构体→

    最近更新
    01
    shell脚本模块集合
    05-13
    02
    生活小技巧(认知版)
    04-29
    03
    生活小技巧(防骗版)
    04-29
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式