Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 【4月更文挑战第21天】Go语言中的`map`提供快速的键值对操作,包括初始化、增删查改和遍历。初始化时,推荐使用`make()`函数,如`make(map[string]int)`。插入和查询键值对直接通过索引访问,更新则重新赋值。删除键值对需用`delete()`函数,确保键存在。遍历map常用`for range`,注意避免在遍历中修改map。了解这些并避免易错点,能提升代码效率和可读性。

Go语言中的map是一种非常实用的数据结构,它提供了基于键值对的快速查找、插入和删除功能。在实际编程中,熟练掌握map的初始化、增删查改操作以及遍历方法对于提升代码效率和可读性至关重要。本篇文章将深入浅出地探讨这些主题,同时揭示常见问题、易错点及相应的规避策略,并通过丰富的代码示例进行演示。
image.png

一、Map的初始化

基本初始化

创建一个空的map,可以使用make()函数:

package main

import "fmt"

func main() {
   
   
    // 初始化一个字符串到整数类型的map
    m := make(map[string]int)
    fmt.Println(m) // 输出:map[]
}

预填充初始化

如果希望在创建时就添加一些键值对,可以采用如下方式:

package main

import "fmt"

func main() {
   
   
    m := map[string]int{
   
   
        "apple":  1,
        "banana": 2,
        "orange": 3,
    }
    fmt.Println(m) // 输出:map[apple:1 banana:2 orange:3]
}

易错点:直接赋值空map m := map[string]int{},虽然语法正确,但不推荐,因为这样可能会引发编译器优化导致的未定义行为。建议始终使用make()函数初始化。

二、Map的增删查改操作

插入键值对

向map中插入数据,只需使用索引赋值的方式:

package main

import "fmt"

func main() {
   
   
    m := make(map[string]int)

    m["pear"] = 4
    fmt.Println(m) // 输出:map[pear:4]
}

查询键值

查询map中某个键对应的值,同样使用索引访问:

package main

import (
    "fmt"
    "log"
)

func main() {
   
   
    m := map[string]int{
   
   "cherry": 5}

    value, exists := m["cherry"]
    if exists {
   
   
        fmt.Println("Value:", value) // 输出:Value: 5
    } else {
   
   
        log.Println("Key not found")
    }
}

更新键值

更新map中已存在的键的值,与插入操作类似,直接对键进行赋值即可:

package main

import "fmt"

func main() {
   
   
    m := map[string]int{
   
   "grape": 6}

    m["grape"] = 7
    fmt.Println(m) // 输出:map[grape:7]
}

删除键值对

使用delete()函数删除指定键的键值对:

package main

import "fmt"

func main() {
   
   
    m := map[string]int{
   
   "kiwi": 8}

    delete(m, "kiwi")
    fmt.Println(m) // 输出:map[]
}

易错点:在未检查键是否存在的情况下直接删除,可能导致运行时错误。务必确保键存在于map中再进行删除操作。

三、Map的遍历

Go语言提供了两种方式遍历map:

使用for range

这是最常见的遍历方式,可以同时获取键和值:

package main

import "fmt"

func main() {
   
   
    fruits := map[string]int{
   
   "pineapple": 9, "watermelon": 10}

    for key, value := range fruits {
   
   
        fmt.Printf("Key: %s, Value: %d\n", key, value)
    }
    // 输出:
    // Key: pineapple, Value: 9
    // Key: watermelon, Value: 10
}

只遍历键或值

有时仅需遍历键或值,可以忽略不需要的部分:

package main

import "fmt"

func main() {
   
   
    fruits := map[string]int{
   
   "peach": 11, "plum": 12}

    // 只遍历键
    for key := range fruits {
   
   
        fmt.Println("Key:", key)
    }

    // 只遍历值
    for _, value := range fruits {
   
   
        fmt.Println("Value:", value)
    }
}

易错点:在遍历过程中修改map可能会导致未定义的行为。若需要在遍历过程中修改map,应先复制map或使用临时变量存储待修改的键值对。

总结,熟练掌握Go语言map的初始化、增删查改操作以及遍历方法,有助于编写高效、清晰的代码。注意避免文中提到的易错点,如直接赋值空map、未检查键存在性进行删除操作、遍历过程中修改map等,将使你的程序更加健壮。通过实践上述代码示例,相信你对Go语言map的理解和应用将更上一层楼。

目录
相关文章
|
11天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
12天前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
12天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
27 3
|
12天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
13天前
|
SQL 安全 Java
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
|
9月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
6月前
|
存储 前端开发 API
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
该文章详细介绍了ES6中Set和Map数据结构的特性和使用方法,并探讨了它们在前端开发中的具体应用,包括如何利用这些数据结构来解决常见的编程问题。
ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用
|
6月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
7月前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
7月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。