9.7 Go语言入门(映射 Map)

Go语言入门(映射 Map)

  • 目录
    • 六、映射 Map
      • 1. 声明和初始化映射
        • 1.1 使用 make 函数
        • 1.2 使用映射字面量
      • 2. 映射的基本操作
        • 2.1 插入和更新元素
        • 2.2 访问元素
        • 2.3 检查键是否存在
        • 2.4 删除元素
        • 2.5 获取映射的长度
      • 3. 遍历映射
      • 4. 映射的注意事项
        • 4.1 映射的零值
        • 4.2 映射是引用类型
        • 4.3 并发安全

目录

Go 语言(Golang)是一种静态类型、编译型语言,由 Google 开发,专注于简洁性、并发和高效性。

下面是 Go 语言的基础语法讲解和代码示例。


上一篇:五、Go语言入门(数组、切片和指针)


六、映射 Map

在 Go 语言中,映射(Map)是一种内置的数据结构,它是一种键值对的集合,提供了高效的键值对查找、插入和删除操作。下面详细讲解 Go 语言中的映射,包括它的声明、初始化、基本操作以及一些高级用法,并提供代码示例。

1. 声明和初始化映射

映射的声明和初始化有多种方式,主要通过 make 函数和映射字面量进行。

1.1 使用 make 函数

make 函数是创建映射的常用方法。它的语法如下:

go make(map[KeyType]ValueType, [capacity])

package main

import "fmt"

func main() {
    // 声明并初始化一个空的映射
    m1 := make(map[string]int)
    fmt.Println(m1) // 输出:map[]

    // 声明并初始化一个具有初始容量的映射
    m2 := make(map[string]int, 10)
    fmt.Println(m2) // 输出:map[]
}

1.2 使用映射字面量

映射字面量允许在声明映射时直接初始化其内容。

package main

import "fmt"

func main() {
    // 使用映射字面量初始化映射
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }
    fmt.Println(m) // 输出:map[Alice:25 Bob:30 Carol:35]
}

2. 映射的基本操作

2.1 插入和更新元素

通过指定键,可以在映射中插入或更新元素。

package main

import "fmt"

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

    // 插入元素
    m["Alice"] = 25
    m["Bob"] = 30

    // 更新元素
    m["Alice"] = 26

    fmt.Println(m) // 输出:map[Alice:26 Bob:30]
}

2.2 访问元素

通过键可以访问映射中的元素。如果键不存在,会返回值类型的零值。

package main

import "fmt"

func main() {
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }

    // 访问存在的键
    age := m["Alice"]
    fmt.Println("Alice's age:", age) // 输出:Alice's age: 25

    // 访问不存在的键
    age = m["Carol"]
    fmt.Println("Carol's age:", age) // 输出:Carol's age: 0
}

2.3 检查键是否存在

可以使用双重赋值语法来检查键是否存在。

package main

import "fmt"

func main() {
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }

    // 检查键是否存在
    age, exists := m["Alice"]
    if exists {
        fmt.Println("Alice's age:", age) // 输出:Alice's age: 25
    } else {
        fmt.Println("Alice does not exist")
    }

    age, exists = m["Carol"]
    if exists {
        fmt.Println("Carol's age:", age)
    } else {
        fmt.Println("Carol does not exist") // 输出:Carol does not exist
    }
}

2.4 删除元素

使用 delete 函数可以删除映射中的元素。

package main

import "fmt"

func main() {
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }

    // 删除元素
    delete(m, "Alice")
    fmt.Println(m) // 输出:map[Bob:30]

    // 尝试删除不存在的键,不会引发错误
    delete(m, "Carol")
    fmt.Println(m) // 输出:map[Bob:30]
}

2.5 获取映射的长度

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

package main

import "fmt"

func main() {
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
    }

    fmt.Println("Length of map:", len(m)) // 输出:Length of map: 2
}

3. 遍历映射

使用 for 循环和 range 关键字可以遍历映射中的所有键值对。

package main

import "fmt"

func main() {
    m := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Carol": 35,
    }

    // 遍历映射
    for key, value := range m {
        fmt.Println(key, "is", value, "years old")
    }
}

4. 映射的注意事项

4.1 映射的零值

映射的零值是 nil,不能直接对其进行读写操作。必须使用 make 或映射字面量进行初始化。

package main

import "fmt"

func main() {
    var m map[string]int
    // m["Alice"] = 25 // 会导致运行时错误

    if m == nil {
        fmt.Println("The map is nil")
    }
}

4.2 映射是引用类型

映射是引用类型,在函数传递时会传递引用,而不是副本。

package main

import "fmt"

func updateMap(m map[string]int) {
    m["Alice"] = 26
}

func main() {
    m := map[string]int{
        "Alice": 25,
    }

    fmt.Println("Before:", m) // 输出:Before: map[Alice:25]

    updateMap(m)

    fmt.Println("After:", m) // 输出:After: map[Alice:26]
}

4.3 并发安全

映射在并发读写时不是线程安全的。若需要并发读写映射,可以使用 sync.Map 或者加锁机制。

package main

import (
    "fmt"
    "sync"
)

func main() {
    var m sync.Map

    // 存储值
    m.Store("Alice", 25)
    m.Store("Bob", 30)

    // 加载值
    age, ok := m.Load("Alice")
    if ok {
        fmt.Println("Alice's age:", age)
    }

    // 删除值
    m.Delete("Alice")

    // 遍历映射
    m.Range(func(key, value interface{}) bool {
        fmt.Println(key, "is", value)
        return true
    })
}

通过理解映射的这些基本和高级操作,可以在 Go 语言编程中高效地使用映射来处理键值对数据。映射在许多实际应用中非常常用,例如存储配置、缓存数据、索引查找等。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693367.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Foxmail邮箱的使用方法和功能最全介绍

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件,今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 ,出现邮箱设置界面输入我们的账号密码,点击…

Elasticsearch 管道查询语言 ES|QL 现已正式发布

作者:Costin Leau, George Kobar 今天,我们很高兴地宣布 ES|QL(Elasticsearch 查询语言)全面上市,这是一种从头开始设计的动态语言,用于转换、丰富和简化数据调查。在新的查询引擎的支持下,ES|Q…

【JAVASE】详讲JAVA语法

这篇你将收获到以下知识: (1)方法重载 (2)方法签名 一:方法重载 什么是方法重载? 在一个类中,出现了多个方法的名称相同,但是它们的形参列表是不同的,那…

Transparent 且 Post-quantum zkSNARKs

1. 引言 前序博客有: SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇 上图摘自STARKs and STARK VM: Proofs of Computational Integrity。 上图选自:Dan Boneh 斯坦福大学 CS251 Fall 2023 Building a SNARK 课件。 SNARK…

逻辑这回事(四)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时,Tsu表示数据前边沿距离时钟上升沿的时间,MicTsu表示时钟clk能够稳定采样数据D的所要求时间,Th表示数据后边沿距离时钟上升沿的时间,MicTh表示时钟clk采样…

C语言王国——数据的内存管理

目录 一、引言 二、整形在内存中的存储 2.1 进制之间的转换 2.1.1 整形的二进制 2.1.2 十进制和二进制 2.1.3 十进制和八进制的转换 2.1.4 十六进制和十进制的转换 2.2 原码,反码,和补码 三、大、小端字节序 3.1 大小端的定义 3.2 为什么会有大…

【Linux进程篇】Linux中的等待机制与替换策略

W...Y的主页 😊 代码仓库分享💕 目录 ​编辑 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 阻塞与非阻塞 进程程序替换 替换原理 替换函数 进程等待 进程等待必要性 之前讲过,子进程退出&am…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求: 风变的AI对话大师一年到期了,也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了,最后480次,我担心信息课题会用到它生图,所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格(…

C# E2Pose人体关键点检测(OpenVINO推理)

C# E2Pose人体关键点检测(OpenVINO推理) 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name:inputimg tensor:Float[1, 3, 512, 512] --------------------------------------------------------------- Ou…

实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》

你有没有发现,困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后,您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后,您应该能够确定有关该 IP 地…

二、Nginx原来是这样?(系列篇02)

二、Nginx原来是这样?(系列篇02) 大家好,我是秋意零。 今天分享Nginx系列篇的第二节。Nginx目录结构、运行原理、基本配置。 更多请关注,Nginx系列篇主页:https://mp.weixin.qq.com/mp/appmsgalbum?__b…

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标: 学习嵌入式实时操作系统(RTOS&#xf…

找素数第二、三种方法

文章目录 第一种 :使用标签第二种:本质是方法的分装 第一种 :使用标签 没有使用信号量。break和continue作用范围只是最近的循环,无法控制外部循环。 此时使用标签 对外部循环进行操作。 package com.zhang; /* 找素数 第二种方…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好,牢饭少不了!!! 原理: 模拟WiFi的已连接设备,强制让其下线重连,获取其握手包,使用密码字典(宝丽)婆洁。 环境(准备工作)&a…

计网仿真综合实验 实验十二

实验十二 综合网络实验 实验过程 IP配置说明参考连线配置OSPF使公司内部联通 路由器R1的OSPF配置路由器R2的OSPF配置路由器R3的OSPF配置R1、R2、R3的相关解释路由器R4的OSPF配置路由器R5的OSPF配置路由器R6的OSPF配置R4、R5、R6解释: 路由器R2的RIP配置路由器R7的RIP配置 总结 …

Unity DOTS技术(十五) 物理系统

要解决性能的瓶颈问题,在DOTS中我们将不再使用Unity自带的物理组件. 下面来分享一下在DOTS中当如何使用物理插件. 一.导入插件 在使用DOTS系创建的实体我们会发现,游戏物体无法受物理系统影响进行运动.于是我们需要添加物理系统插件. 1.打开Package Manager > 搜索插件Uni…

IT人的拖延——都是“分心”惹的祸?

典型表现 我们说到拖延的原因有很多,还有一个原因是因为“分心太多“造成的,分心太多的拖延大致上有以下表现: 无法集中注意力: 分心太多会导致我们无法集中注意力在当前的工作任务上,我们可能会经常性地走神或者在工…

你好GPT-4o——对GPT-4o发布的思考与看法

你好GPT-4o 前言 2024年5月13日,OpenAI官网发布了他们的新一代自然语言处理交互系统——GPT-4o。这是OpenAI继GPT4之后又一个新的旗舰模型。 GPT-4o(“o”代表“omni”)是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意…

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本:1.8 参考文档 MYSQL版本:8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统:CentOS 1.1 建立存…

Golang | Leetcode Golang题解之第133题克隆图

题目: 题解: func cloneGraph(node *Node) *Node {if node nil {return node}visited : map[*Node]*Node{}// 将题目给定的节点添加到队列queue : []*Node{node}// 克隆第一个节点并存储到哈希表中visited[node] &Node{node.Val, []*Node{}}// 广…