【Go】Go数据类型详解—map

embedded/2024/12/27 10:16:50/

1. 前言

本篇博客将会介绍Go语言当中的另一大核心数据类型——map(映射),当然在介绍这个数据类型之前我们还是要思考引入这个数据类型的原因:

❓ 需求:要求完成对一个班级所有同学的信息管理(包括但不限于增删改查),主要字段有名字,编号并且能够根据编号快速修改对应同学的信息

在我们学习map之前,我们唯一学过的收集器类型就是数组与切片,那么可以通过下面的代码完成上述功能:

// 定义学生姓名
var stuNameArr = []string{"zhangsan", "lisi", "wangwu"}
var stuIdArr = []string{"1001", "1002", "1003"}
// 修改编号为1001的同学姓名为zhangyi
var targetIndex = -1
for index, id := range stuIdArr {if id == "1001" {targetIndex = indexbreak}
}
stuNameArr[targetIndex] = "zhangyi"
fmt.Println(stuNameArr)

从上述代码我们可以看出,我们只能通过两个切片分别存储学生的姓名和编号,当需要修改某个特定学生的信息时,我们还需要查找出目标学生的存储下标,并根据该下标修改其余切片的信息。

📖 缺点:上述代码归根到底没有做到对学生信息的统一管理,并且实际上学生的编号与姓名之间应该存在着某种对应关系,不应该依赖于下标进行间接关联,而是应该存在直接关联关系!于是引入了我们的映射类型——map

2. map类型

2.1 map简介

Map:Go语言当中的map是一种**Key(键)-Value(值)**结构的数据类型,可以通过key快速定位到value值,事实上很多编程语言都有对应的Key-Value结构,比如Python当中的字典、JavaScript当中的object

📖 数组与映射的区别:

  1. 数组是连续存储的,但是map其底层实现决定了它是随机存储的
  2. 数组可以通过下标index访问某个元素值,但是map当中只能通过key访问对应的value元素值

2.2 map的声明和初始化

map是一个引用类型,其声明语法如下:

var map_name map[key_type]value_type

其中:

  • map_name:变量名称
  • key_type:键的类型
  • value_type:值的类型
2.2.1 初始化方式1

初始化方式1:先声明后赋值

由于map也是一个引用数据类型,因此如果声明未赋值时不会开辟空间,也不会进行初始化,同样需要通过make函数进行初始化,语法如下:

var map_name = make(map[key_type]value_type)

// 先声明
var stu = make(map[string]string)
// 再赋值
stu["name"] = "zhangsan"
stu["age"] = "21"
fmt.Println(stu)

❗ 注意:

  1. map当中的键是无序的,因此每次打印的顺序不一定相同
  2. map当中的键是唯一的、不重复的
2.2.2 初始化方式2

初始化方式2:使用符合字面量声明并赋值

语法如下:

var map_name = map[key_type]value_type{"key1": value1, "key2": value2...}

// 声明并赋值
var stuMap = map[string]string{"name": "zhansgan", "age": "21"}
fmt.Println(stuMap)

2.3 map常见操作

2.3.1 新增

语法格式:map_name[key] = value

如果在map当中没有对应的key时就会进行新增

// map的新增操作
var stuMap = make(map[string]string)
stuMap["name"] = "zhangsan"
stuMap["age"] = "21"
fmt.Println(stuMap)

程序运行结果:

2.3.2 修改

语法格式:map_name[key] = value

与新增操作不同:当map中已经有该key键时,就会将对应的value进行修改

// map的修改操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhangsan"
fmt.Println(stuMap)
// 修改name
stuMap["name"] = "lisi"
fmt.Println(stuMap)

程序运行结果:

2.3.3 查询

语法格式:var value, exists = map_name[key]

  • 如果对应的key存在则value存储对应值,exists值为true
  • 如果对应的key不存在则value为空,exists值为false
// map的查询操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
// 查询name
name, exists := stuMap["name"]
if exists {fmt.Println("name值为: " + name)
} else {fmt.Println("name不存在!")
}
// 查询age
age, exists := stuMap["age"]
if exists {fmt.Println("age值为: " + age)
} else {fmt.Println("age不存在!")
}

程序运行结果:

2.3.4 删除

语法格式:delete(map_name, key)

map的删除则需要使用到内置delete函数,第一个参数为map对象,第二个参数为待删除的key值

// map的删除操作
var stuMap = make(map[string]string)
// 新增name
stuMap["name"] = "zhansgan"
fmt.Println(stuMap)
// 删除name
delete(stuMap, "name")
fmt.Println(stuMap)

程序运行结果:

2.3.5 遍历

语法格式:for k, v := range map_name {}

与数组切片不同,数组切片既可以通过索引下标进行遍历,也可以通过range迭代遍历。但是map没有索引这个概念,因此只能通过range进行迭代遍历

// map的遍历操作
var stuMap = make(map[string]string)
// 新增name,age,id
stuMap["name"] = "zhansgan"
stuMap["age"] = "21"
stuMap["id"] = "1001"
// range遍历
for k, v := range stuMap {fmt.Println(k, v)
}

程序运行结果:


http://www.ppmy.cn/embedded/149147.html

相关文章

从 GitLab.com 到 JihuLab.com 的迁移指南

本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期,GitLab Inc. 针对其 SaaS 产品做了限制,如果被判定为国内用户,则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品(GitLab.com)迁移到极狐GitL…

人工智能的崛起:从机器学习到深度学习,再到计算机视觉

在科技迅速发展的今天,人工智能(AI)已经从科幻的想象,逐步成为改变社会的核心动力之一。从自动驾驶到智能语音助手,从医疗诊断到推荐系统,人工智能技术的应用场景无处不在。在这些技术背后,机器…

解锁 Claude 的无限潜力:Prompt Engineering 从入门到精通

在人工智能领域,大型语言模型(LLM)如 Claude 的崛起,为我们带来了前所未有的机遇。然而,如何有效地与这些强大的模型进行交互,使其发挥出最大的潜力,成为了关键。Prompt Engineering&#xff08…

基于ArcGIS Pro的SWAT模型在流域水循环、水生态模拟中的应用及案例分析;SWAT模型安装、运行到结果读取全流程指导

目前,流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型,能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM

一、引言 碰一碰发视频作为一种新兴的信息传递和交互方式,在多个领域展现出了广阔的应用前景,尤其是在商业推广、文化传播、教育等方面。碰一碰矩阵则是对传统碰一碰技术的一种拓展,通过多个碰一碰设备或标签的组合,实现更复杂的功…

监听器listener

文章目录 监听器( listener)对Application内置对象监听的语法和配置对session内置对象监听的语法和配置 监听器( listener) 对象与对象的关系: 继承关联 tomcat一启动创建的顺序:监听器,config,application(全局初始化参数)&am…

关于埃斯顿机器人文件导出或者系统日志导出

关于埃斯顿机器人文件导出或者日志导出,登录模式,选择高级设置,控制器备份恢复 选择U盘导入地址,点击导出,等待时间30秒就可以查看文件格式和系统日志

神经网络、深度学习、卷积神经网络

好的!我会尽量详细且易懂地为你解释这些概念,并在最后用简单直白的语言总结一下。 1. 神经网络思想 神经网络是灵感来自于生物大脑神经元的工作原理,是一种模仿人类大脑处理信息的方式来设计的数学模型。我们的大脑由亿万个神经元组成&…