golang的Map

Map集合

概述

Map 是一种无序的键值对的集合。

Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。

Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,遍历 Map 时返回的键值对的顺序是不确定的。

在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 “”。

Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量。

定义map

map关键字定义

基本语法

var 集合名 map[键类型]值类型;

举例

package map_knowledgeimport "fmt"//通过关键字定义map
func CreateMap() {var map1  map[string]string;fmt.Printf("map1的值为%#v\n",map1)
}

结果

map1的值为map[string]string(nil)

注意

用关键字定义的map初始值为nil,我们不能对其直接操作。

package map_knowledgeimport "fmt"//通过关键字定义map
func CreateMap() {var map1  map[string]string;fmt.Printf("map1的值为%#v\n",map1)//用关键字定义的map为nil,不能直接操作/*报错:panic: assignment to entry in nil map*/// map1["name"] = "zhansan"
}

小结

这种用关键字定义的map就是一个空集合,如果要能够操作只有两种等价方案。

function CreateMap(){//方案1:定义完后用make开辟空间var map1 map[string]stringmap1 = make(map[string]string)//方案2:定义的时候赋值初始化//这样golang也会为map开辟空间var map2 = map[string]string{"name":"lisa"}
}

make定义

make既可以用于帮空集合开辟空间,也可以直接定义集合,golang官方也推荐这种形式。

基本语法

/* 使用 make 函数 */
map_variable := make(map[KeyType]ValueType, initialCapacity)

其中KeyType是键的类型,ValueType是值的类型,initialCapacity是可选的参数,用于指定 Map 的初始容量。

Map 的容量是指 Map 中可以保存的键值对的数量,当 Map 中的键值对数量达到容量时,Map 会自动扩容。

如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。

一般来说我们不用特别指定容量,因为即使我们指定了,如果不够也会自己扩容。

举例

//通过make定义map
func CreateMapByMake(){var map1 = make(map[string]string,2)fmt.Printf("map1的值为%#v\n",map1)
}

结果

map1的值为map[string]string{}

注意

由于make定义开辟了空间,所以map可以直接操作。(这也是推荐用make定义的原因。)

func CreateMapByMake(){var map1 = make(map[string]string,2)fmt.Printf("map1的值为%#v\n",map1)map1["name"]="lisa"fmt.Printf("赋值后,map1的值为%#v\n",map1)
}

结果为

map1的值为map[string]string{}
赋值后,map1的值为map[string]string{"name":"lisa"}

map初始化

字面量初始化

基本语法

var map变量 map[键类型]值类型 = map[键类型]值类型{初始值}
//可以省略左边的类型
var map变量 = map[键类型]值类型{初始值}

map可以通过赋值直接初始化,例如:

var map1 = map[string]int{//最后一项也要有逗号"name":10,
}

注意事项

以字面量初始化map,内部的每一项用,隔开,且最后一项也必须要有,

make初始化

我们先查看make的源码:

func make(t Type, size ...IntegerType) Type

所以make只能先定义map,然后靠赋值初始化。

var map1 = make(map[string]int)
map1["age"] = 19

map访问

注意事项

我们只能操作开辟了内存空间的map,用关键字定义但是没有初始化的map是空map,无法操作.(见上文)

访问map

基本语法

map[keyValue];

访问不存在的键名不会报错,只会返回值类型的零值。

因为map[键类型]值类型,起初就指定了值的类型

举例

//访问map
func VisitMap(){var map1 = map[string]int{"age":19,}fmt.Printf("age的值为%#v\n",map1["age"])fmt.Printf("访问不存在的项值为%#v\n",map1["other"])
}

结果

age的值为19
访问不存在的项值为0

严格访问map

我们还可以用另一种方式访问map,来得知键是否存在。

基本语法

/*第一个返回值是键名对应的值,如果存在则返回值,否则为类型零值第二个返回值判断键是否存在,如果存在则是true,反之false
*/
val,isOk := map[键名] 

举例

func VisitMapIsOk(){var map1 = map[string]int{"age":19,}ageVal,isAgeOk := map1["age"]fmt.Printf("age存在为%v,age的值为%#v\n",isAgeOk,ageVal)nameVal,isNameOk := map1["name"]fmt.Printf("name存在为%v,name的值为%#v\n",isNameOk,nameVal)
}

结果

age存在为true,age的值为19
name存在为false,name的值为0

任意类型的值

我们可以用interface{}空接口类型来接收任意类型的值。

func InterfaceMap(){//interface{}是值类型var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("键%v对应的值为%v\n",key,val)}
}

结果

键name对应的值为lisa
键age对应的值为19
注意事项1:零值

interface{}是一个字面量类型,被称为空接口类型,零值为<nil>

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("键%v对应的值为%v\n",key,val)}//注意事项1:interface{}是一个类型,零值为nilfmt.Printf("不存在的键的值为%v\n",map1["other"])
}

结果

键name对应的值为lisa
键age对应的值为19
不存在的键的值为<nil>
注意实现2:类型断言

interface{}类型的值在实际使用时需要类型断言,

断言语法

讲接口时会详述

var n interface{}
n = "world"
//val是值,ok代表是否成功
val,ok := n.(string)

如果断言出错也会报错,例如

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("键%v对应的值为%v\n",key,val)}//注意事项1:interface{}是一个类型,零值为nilfmt.Printf("不存在的键的值为%v\n",map1["other"])//注意事项2:interface{}类型的值在实际使用时要进行类型断言if(map1["age"].(int64)>=18){fmt.Printf("你已经是个成年人了")}
}

报错

panic: interface conversion: interface {} is int, not int64

正确案例

func InterfaceMap(){var map1 = map[string]interface{}{"name":"lisa","age":19,}for key, val := range map1 {fmt.Printf("键%v对应的值为%v\n",key,val)}//注意事项1:interface{}是一个类型,零值为nilfmt.Printf("不存在的键的值为%v\n",map1["other"])//注意事项2:interface{}类型的值在实际使用时要进行类型断言/*可以先通过打印来判断具体类型,或者用switch方法*/fmt.Printf("键age的值类型为%T\n",map1["age"])if(map1["age"].(int)>=18){fmt.Printf("你已经是个成年人了")}
}

结果

键name对应的值为lisa
键age对应的值为19
不存在的键的值为<nil>
键age的值类型为int
你已经是个成年人了

map增改

基本语法

map[] =

如果键存在就是修改,否则就是新增。

map的长度

基本语法

len(map)

注意:不能用cap(map)求容量,因为map的容量用处不大,只是初始开辟空间时给个提示,未来可以轻松扩容。

举例

func GetMapLen(){var map1 = map[string]int{"age":19,}fmt.Printf("map1的长度为%d\n",len(map1))
}

结果

map1的长度为1

delete删除元素

基本语法

//要注意键的类型,golang是强类型语言
delete(map变量,键名)

举例

func DelMapItem(){var map1 = map[int64]string{1:"hello",2:"world",}fmt.Printf("删除前map1的值为%#v\n",map1)//删除delete(map1,1)fmt.Printf("删除后map1的值为%#v\n",map1)
}

结果

删除前map1的值为map[int64]string{1:"hello", 2:"world"}
删除后map1的值为map[int64]string{2:"world"}

注意事项

1.删除不存在的键不会报错。例如

func DelMapItem(){var map1 = map[int64]string{1:"hello",2:"world",}fmt.Printf("删除前map1的值为%#v\n",map1)//删除delete(map1,1)fmt.Printf("删除后map1的值为%#v\n",map1)//删除不存在的键,不会报错delete(map1,3)
}

2.被删除元素的影响

如果是map存在的元素:
1.map长度发生变化
2.map遍历时访问不到

但是我们仍然可以通过map[键名]访问到,返回值类型的零值,和之前一样。

但是用严格访问会提示为false.

map遍历

我们可以用for...range遍历map。

基本语法

for,:= range map{}

举例

//遍历map
func RnageMap(){var map1 = map[int64]string{1:"hello",2:"world",}for key, val := range map1 {fmt.Printf("键%v对应的值为%v\n",key,val)}
}

结果

键1对应的值为hello
键2对应的值为world

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB数据采集卡 Labview采集卡 32路AD模拟量采集 DAQ卡

今天给大家介绍阿尔泰科技的一款多功能数据采集卡USB3150/1/2/5/6 。 该板卡提供 32RSE / NRSE 通道或 16 通道 DIFF 模 拟量输入&#xff1b;4 通道模拟量同步输出&#xff1b;16 路可编程 I/O&#xff1b;2 路计数器。 USB3150/1/2/5/6 的主要应用场合为&#xff1a;电子产品…

K8s 1.27.1 实战系列(十)PV PVC

一、核心概念与关系 ​1、PV(Persistent Volume)​ PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…

基于DeepSeek的智能数据分析和自动化处理系统:引领BI行业新变革

近期&#xff0c;一款基于DeepSeek API的智能数据分析和自动化处理系统横空出世&#xff0c;以其强大的功能和灵活的可扩展性&#xff0c;为BI行业带来了颠覆性的变革。 该系统支持多类型数据分析&#xff0c;包括文本 、指标和日志等。在文本分析方面&#xff0c;它能够提取关…

图形学面试题总结

图形学面试题总结 文章目录 图形学面试题总结Opengl 与 Vulkan1、OpenGL的渲染管线有哪些主要阶段&#xff1f;分别做什么&#xff1f;2、OpenGL中的VAO、VBO和EBO分别是什么&#xff1f;为什么需要它们&#xff1f;3、细分着色器与几何着色器是什么4、Vulkan与Opengl的区别是什…

Vue 系列之:路由

vue-router 组件 router-link 功能&#xff1a;用于导航&#xff0c;即渲染一个链接&#xff0c;当点击时&#xff0c;导航到由 to 属性指定的 URL。 示例&#xff1a;<router-link to"/home">Home</router-link> 它会渲染为一个 <a> 标签&…

通过mybatis的拦截器对SQL进行打标

1、背景 在我们开发的过程中&#xff0c;一般需要编写各种SQL语句&#xff0c;万一生产环境出现了慢查询&#xff0c;那么我们如何快速定位到底是程序中的那个SQL出现的问题呢&#xff1f; 2、解决方案 如果我们的数据访问层使用的是mybatis的话&#xff0c;那么我们可以通过…

【Linux】centos配置可用的yum源

在 CentOS 系统中配置可用的 YUM 源&#xff08;仓库&#xff09;是保持系统更新和软件包管理的重要步骤。下面是一些步骤和示例&#xff0c;帮助你配置可用的 YUM 源&#xff1a; 1. 备份当前 YUM 仓库配置 首先&#xff0c;备份你当前的 YUM 仓库配置文件&#xff0c;以防万…

【CentOS】搭建Radius服务器

目录 背景简介&#xff1a;Radius是什么&#xff1f;Radius服务器验证原理搭建Radius服务器环境信息yum在线安装配置FreeRADIUS相关文件clients.conf文件users文件重启服务 验证 参考链接 背景 在项目中需要用到Radius服务器作为数据库代理用户的外部验证服务器&#xff0c;做…

机器学习_特征工程

一、核心知识点&#xff1a;特征工程的核心概念与流程 1. 特征工程的定义与重要性 定义&#xff1a;通过数据预处理、特征构造、特征选择等方法&#xff0c;将原始数据转化为更适合机器学习模型输入的特征&#xff0c;提升模型性能。重要性&#xff1a; “数据和特征决定了机…

Elasticsearch Java High Level Client [7.17] 使用

es 的 HighLevelClient存在es源代码的引用&#xff0c;结合springboot使用时&#xff0c;会存在es版本的冲突&#xff0c;这里记录下解决冲突和使用方式&#xff08;es已经不建议使用这个了&#xff09;。 注意es服务端的版本需要与client的版本对齐&#xff0c;否则返回数据可…

rtsp在网页上显示(webrtc-stream)

一&#xff1a;windos 平台 1&#xff1a;下载已经编译好的windos平台程序 Releases mpromonet/webrtc-streamer (github.com) or 【免费】webrtc-streamerv0.8.6一款werbrtc服务器&#xff08;windos版本&#xff09;&#xff0c;可以直接将rtsp流拉到网页上显示资源-CSDN文…

【AI大模型智能应用】Deepseek生成测试用例

在软件开发过程中&#xff0c;测试用例的设计和编写是确保软件质量的关键。 然而&#xff0c;软件系统的复杂性不断增加&#xff0c;手动编写测试用例的工作量变得异常庞大&#xff0c;且容易出错。 DeepSeek基于人工智能和机器学习&#xff0c;它能够依据软件的需求和设计文…

如何在vscode中编译linux中的c++文件

方式一 在终端打开进行连接编译 指令含义&#xff1a;将 muduo_server.cpp 源文件编译成一个可执行文件 server&#xff0c;并且在链接过程中使用 muduo_net、muduo_base 库以及 pthread 库 方式二 在vscode中修改配置文件 按F1打开配置文件搜索栏&#xff0c;输入C/C 打开…

基于Flink SQL的实时指标多维分析模型

数据流程介绍 1.创建源表kafka接入消息队列数据&#xff0c;定义字段映射规则&#xff1b; 2.创建目标表es_sink配置Elasticsearch输出&#xff1b; 3.通过多级视图&#xff08;tmp→tmp_dedup→tmp1/tmp2→tmp3→tmp_groupby&#xff09;实现数据清洗、去重、状态计算&#x…

【vscode-01】vscode不同项目不同语言扩展插件隔离方案

vscode不同项目不同语言扩展插件隔离方案 1. 背景2. vscode 扩展插件隔离方案2.1 code-profile 配置文件2.2 配合extensions.json 1. 背景 最近打开vscode 发现越来越卡&#xff0c;这是一个轻量级代码编辑器&#xff0c;怎么会如此占用内存呢&#xff1f; 我使用了‘code --l…

《基于大数据的营养果蔬推荐系统的设计与实现》开题报告

目录 一、选题的理论意义现实意义及应用价值 &#xff08;一&#xff09;理论意义 &#xff08;二&#xff09;现实意义 1.用户价值提升 2.效率提升 3.经济效益提升 &#xff08;三&#xff09;应用价值 1.提升用户健康水平 2.优化购物体验 3.支持健康决策 4.促进农业…

《C#上位机开发从门外到门内》2-4:Modbus协议

文章目录 一、引言二、Modbus协议概述2.1 Modbus协议的起源与发展2.2 Modbus协议的基本特点2.3 应用领域 三、Modbus通信原理详解3.1 Modbus RTU原理3.1.1 数据帧结构3.1.2 数据传输与时序3.1.3 错误检测 3.2 Modbus TCP原理3.2.1 数据封装3.2.2 通信机制3.2.3 与RTU模式的区别…

观成科技:​加密C2框架Platypus流量分析

一、工具介绍 Platypus 是一款支持多会话的交互式反向 Shell 管理器。在实际的渗透测试中&#xff0c;为了解决 Netcat/Socat 等工具在文件传输、多会话管理方面的不足,该工具在多会话管理的基础上增加了在渗透测试中能更好发挥作用的功能&#xff08;如&#xff1a;交互式 Sh…

OpenBMC:BmcWeb 处理http请求

OpenBMC:BmcWeb 读取http请求头-CSDN博客 介绍了,在读取完http头后,将调用Connection::handle处理http请求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …

MySQL事务深度解析:ACID特性、隔离级别与MVCC机制

引言 在数据库系统中&#xff0c;​事务是保障数据一致性与完整性的核心机制。MySQL通过ACID特性、多级隔离策略和MVCC&#xff08;多版本并发控制&#xff09;实现了高性能与高可靠性的平衡。本文将从底层原理出发&#xff0c;系统解析事务的四大特性、隔离级别的实现逻辑&am…