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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 【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的理解和应用将更上一层楼。

目录
相关文章
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
110 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
66 4
Golang语言文件操作快速入门篇
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
101 3
Golang语言之gRPC程序设计示例
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
50 4
Golang语言goroutine协程篇
|
2月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
51 3
Golang语言之Prometheus的日志模块使用案例
|
1月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
30 0
|
2月前
|
JSON Go 数据格式
Golang语言结构体链式编程与JSON序列化
这篇文章是关于Go语言中结构体链式编程与JSON序列化的教程,详细介绍了JSON格式的基本概念、结构体的序列化与反序列化、结构体标签的使用以及如何实现链式编程。
38 4
|
2月前
|
Go
Golang语言结构体(struct)面向对象编程进阶篇(封装,继承和多态)
这篇文章是关于Go语言中结构体(struct)面向对象编程进阶篇的教程,涵盖了Go语言如何实现封装、继承和多态,以及结构体内存布局的相关概念和案例。
142 4