当前位置: 首页 > news >正文

go语言中的map类型详解

在Go语言中,map是一种内建的数据结构,提供了键值对(key-value)的存储方式。map通常用于实现快速的查找和关联数组,适合在需要根据键来高效查找值的场景下使用。

基本概念

map是一个无序的集合,它存储了键值对。在Go中,map的键和值可以是任意类型,但键的类型必须支持==!=操作符,因此一些复杂类型(如切片、函数)无法作为键。

map的声明与初始化

在Go中,可以使用以下几种方式来声明和初始化map

  1. 使用make函数创建map

    m := make(map[string]int)

    这里创建了一个string类型为键、int类型为值的空map

  2. 使用字面量初始化map

    m := map[string]int{"one": 1, "two": 2, "three": 3}

    直接初始化带有值的mapm包含三个键值对。

map的基本操作

1. 添加或更新键值对

要向map中添加或更新键值对,直接使用map[key] = value的语法:

m := make(map[string]int)
m["a"] = 10 // 添加一个键值对 "a": 10
m["b"] = 20 // 添加一个键值对 "b": 20
m["a"] = 15 // 更新键"a"的值为15
2. 获取值

可以通过键来获取对应的值。如果键不存在,map将返回值类型的零值。例如,如果map的值类型为int,将返回0

value := m["a"] // 获取键"a"对应的值

要判断键是否存在,可以使用以下方式:

value, ok := m["a"]
if ok {fmt.Println("键存在,值为", value)
} else {fmt.Println("键不存在")
}
3. 删除键值对

使用delete函数删除map中的键值对:

delete(m, "a") // 删除键"a"的键值对
4. 遍历map

可以使用for range循环遍历map中的所有键值对:

for key, value := range m {fmt.Println(key, value)
}

由于map是无序的,遍历的顺序并不固定。

使用map的注意事项

  1. map的键类型限制:键类型必须支持==!=操作符,因此切片、函数和其他复杂类型不能作为键。

  2. map的线程安全:Go语言中的map不是线程安全的。如果多个协程同时读写一个map,可能会导致竞态条件,需要使用sync.RWMutex或专用的并发安全map来保证线程安全。

  3. 零值初始化map的零值为nil,对nil map执行赋值操作会导致运行时错误。要避免这个问题,可以使用make函数来初始化一个空map

map的性能优化:指定初始容量

如果能预估map中键值对的数量,使用make函数创建时可以指定初始容量,从而减少内存分配的次数,提高性能:

m := make(map[string]int, 100) // 创建一个初始容量为100的map

例子:计数单词出现的次数

下面的代码演示了使用map来统计字符串中每个单词出现的次数:

package mainimport ("fmt""strings"
)func wordCount(text string) map[string]int {words := strings.Fields(text)counts := make(map[string]int)for _, word := range words {counts[word]++ // 如果word不存在,默认为0,直接++即可}return counts
}func main() {text := "go is a programming language go is efficient"counts := wordCount(text)fmt.Println("Word counts:", counts)
}

在这个例子中,wordCount函数将字符串拆分成单词,然后使用map来统计每个单词的出现次数。

总结

  • map是Go语言中的一种内建数据结构,使用键值对存储数据。
  • 可以通过make函数创建空map,或通过字面量进行初始化。
  • map支持添加、更新、删除、获取和遍历操作,但它是无序的。
  • map不是线程安全的,并且键类型需支持相等性操作。
  • 如果能预估大小,使用make初始化map时指定容量可以优化性能。

相关文章:

go语言中的map类型详解

在Go语言中,map是一种内建的数据结构,提供了键值对(key-value)的存储方式。map通常用于实现快速的查找和关联数组,适合在需要根据键来高效查找值的场景下使用。 基本概念 map是一个无序的集合,它存储了键…...

GBase 8a MPP Cluster V9安装部署

GBase 8a MPP Cluster V9安装部署 安装环境准备 节点角色操作系统地址配置GBASE版本gbase01.gbase.cnGCWARE,COOR,DATACentOS 7.9192.168.20.1422C4GGBase 8a MPP Cluster V9 9.5.3.28.12gbase02.gbase.cnGCWARE,COOR,DATACentOS 7.9192.168.20.1432C4GGBase 8a MPP Cluster …...

静态库、动态库、framework、xcframework、use_frameworks!的作用、关联核心SDK工程和测试(主)工程、设备CPU架构

1.1库的概念 库:程序代码的集合,编译好的二进制文件加上头文件供使用,共享程序代码的一种方式。 1.2库的分类 根据开源情况分为:开源库(能看到具体实现)、闭源库(只公开调用的的接口&#xf…...

C++ | Leetcode C++题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; class Solution { public:static constexpr int MOD 1000000007;vector<vector<long>> pow(vector<vector<long>> mat, int n) {vector<vector<long>> ret {{1, 0, 0, 0, 0, 0}};while (n > 0) {…...

网站架构知识之Ansible(day020)

1.Ansible架构 Inventory 主机清单:被管理主机的ip列表,分类 ad-hoc模式: 命令行批量管理(使用ans模块),临时任务 playbook 剧本模式: 类似于把操作写出脚本,可以重复运行这个脚本 2.修改配置 配置文件&#xff1a;/etc/ansible/ansible.cfg 修改配置文件关闭主机Host_key…...

K8s使用nfs

改动点 ip和路径改为自己的 --- apiVersion: v1 kind: ServiceAccount metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: nfs-client --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata:nam…...

【大数据学习 | kafka高级部分】kafka的kraft集群

首先我们分析一下zookeeper在kafka中的作用 zookeeper可以实现controller的选举&#xff0c;并且记录topic和partition的元数据信息&#xff0c;帮助多个broker同步数据信息。 在新版本中的kraft模式中可以这个管理和选举可以用kafka自己完成&#xff0c;而不再依赖zookeeper。…...

爬虫策略规避:Python爬虫的浏览器自动化

网络爬虫作为一种自动化获取网页数据的技术&#xff0c;被广泛应用于数据挖掘、市场分析、竞争情报等领域。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;简单的爬虫程序往往难以突破网站的反爬虫策略。因此&#xff0c;采用更高级的爬虫策略&#xff0c;如浏览器自动…...

Hive 实现查询用户连续三天登录记录

标题&#xff1a;Hive 实现查询用户连续三天登录记录 在数据分析和处理中&#xff0c;经常会遇到需要查询特定条件数据的情况。本文将介绍如何使用 Hive 来查询用户连续三天登录的所有数据记录。 一、问题背景 我们有一个用户登录记录表&#xff0c;其中包含用户的登录日期信…...

OceanBase 4.3.3 功能解析:列存副本

OceanBase 从4.3.0 版本开始&#xff0c;引入了列式存储的支持。用户可以根据业务的具体需求&#xff0c;选择创建列存表、行存表或是行列混存表。无论选择哪种表类型&#xff0c;在不同的Zone内&#xff0c;租户使用的副本模式都是一致的。详见官网文档&#xff1a; https://w…...

2.Python解释器

python解释器程序&#xff0c;用来翻译python代码&#xff0c;并提交给计算机执行。 上一篇博客就是安装了python解释器程序 写一个python文件&#xff0c;在文件中写入多行代码并执行&#xff1a; 进入python后&#xff0c;输入exit()命令退出...

鸿蒙与团结引擎c#与ts简单交互

目录 团结中调用ts代码 鸿蒙中调用团结代码 首先在团结创建代码&#xff0c;需要将代码添加到场景物体中 devecoStudio端编写ts代码 在index页面添加一个测试按钮 团结中调用ts代码 团结引擎 - 手册: Call TypeScript plug-in code from C# scripts 注册函数要跟文件名一致 在u…...

Any 的原理以及实现

序言 在 C17 的更新中引入了一个特别有意思的类型&#xff0c;它提供了一种通用的方式来存储任何类型的数据而不需要提前指定类型&#xff0c; 该类型就是 any。  any 允许你将任意类型的数据存储在一个容器中&#xff0c;并且能够在运行时动态地访问该数据。话不多说&#xf…...

SQLI LABS | Less-35 GET-Bypass Add Slashes (we dont need them) Integer Based

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-35/ 话不多说…...

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…...

【AI抠图整合包及教程】探索SAM 2:图像与视频分割领域的革新者

在人工智能的浩瀚星空中&#xff0c;Meta公司的Segment Anything Model 2&#xff08;SAM 2&#xff09;犹如一颗璀璨的新星&#xff0c;以其前所未有的图像与视频分割能力&#xff0c;照亮了计算机视觉领域的新航道。SAM 2不仅继承了其前身SAM在零样本分割领域的卓越表现&…...

DevExpress中文教程 - 如何使用AI模型检查HTML编辑中的语法?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 目前许多开发人员正在寻找多种方法将AI添加到解决方案中&#xff08;这通常比想象的要…...

python包管理工具pip和conda的使用对比

python包管理工具pip和conda的使用对比 总述1. pip使用2. conda注意虚拟环境之间的嵌套&#xff0c;这个会导致安装包后看不到包&#xff0c;实际是安装到了base环境里 未完待续 总述 pip相对于conda,对应包的依赖关系管理不强&#xff0c;坏处是容易造成包冲突&#xff0c;好…...

Linux案例:DNS服务器配置

Linux案例&#xff1a;DNS服务器配置 实验一&#xff1a;正向解析 服务端配置&#xff1a; [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…...

【Python】__getitem__()方法

getitem() 方法介绍 __getitem__ 方法是 Python 中的一个特殊方法&#xff08;也被称为魔术方法或特殊方法&#xff09;&#xff0c;用于在类中实现索引访问对象元素的操作。这个方法允许对象实现类似于列表、字典等容器类型的索引操作。当自定义类中定义了 __getitem__ 方法时…...

《Atomic Picnic》进不去游戏解决方法

Atomic Picnic有时候会遇到进不去游戏的情况&#xff0c;这可能是由多种原因造成的&#xff0c;玩家可以采取很多解决方法&#xff0c;比如检查电脑配置、更新系统和驱动或验证游戏文件。 Atomic Picnic进不去游戏怎么办 检查电脑配置 查看自己的电脑配置是否达到了游戏的要求…...

学习日志007--python函数 学完再练习练

函数小练习 一、函数的概念 1.定义 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 2.作用 函数能提高应用的模块性&#xff0c;和代码的重复利用率 3.定义 函数代码块以 def 关键词开头&#xff0c;后接函数标识符…...

DOM操作和事件监听综合练习——轮播图

下面制作一个如下图所示的轮播图&#xff08;按Enter键可以控制轮播的开启和关闭&#xff0c;或者点击按钮“第几张”即可跳转到第几张&#xff09;&#xff1a; 下面是其HTML和CSS代码&#xff08;还没有设置轮播&#xff09;&#xff1a; <!DOCTYPE html> <html …...

nodejs:下载,安装,系统环境配置,更换镜像

​​​​ 下载 地址&#xff1a;https://nodejs.org/zh-cn/download/prebuilt-installer 安装包 开始安装 安装完成 配置环境变量 将原来的用户变量-> Path D:\nodejs\node_global 【系统变量】 添加Path–>变量名&#xff1a;NODE_PATH-> 变量值&#xff1a;D: \…...

【Django】视图函数

【Django】视图函数 视图函数的本质是Python中的函数&#xff0c;视图函数负责处理用户的请求并返回响应&#xff0c;该响应可以是网页的HTML内容、重定向、404错误、XML文档、图像或者任何东西&#xff0c;一般在应用中的views.py编写&#xff0c;示例代码如下&#xff1a; …...

MySQL查询-补充

数据准备&#xff1a; -- 部门表 create table dept(deptno int primary key, -- 部门编号 主键&#xff1a;唯一&#xff0c;非空dname varchar(14), -- 部门名称loc varchar(13) -- 部门地址 );insert into dept values (10,accounting,n…...

【Python Tips】多个条件判断——一种更加简洁清晰的写法

一、引言 在python写条件判断 if 语句时&#xff0c;有时会遇到多种条件的真假判断考虑&#xff0c;比如要同时考虑A和B两个变量的True or False&#xff0c;只有当两者都为真&#xff0c;或都为假&#xff0c;或任意为真为假&#xff0c;再继续处理。此时如果用 if&#xff0c…...

【Vue】简易博客项目跟做

项目框架搭建 1.使用vue create快速搭建vue项目 2.使用VC Code打开新生成的项目 端口号简单配置 修改vue.config.js文件&#xff0c;内容修改如下 所需库安装 npm install vue-resource --save --no-fund npm install vue-router3 --save --no-fund npm install axios --save …...

【HarmonyOS】PixelMap转化为Uri

【HarmonyOS】PixelMap转化为Uri 问题背景 鸿蒙中的PixelMap类型&#xff0c;其实类似于Android和IOS中的bitmap&#xff0c;是对图片数据信息进行描述的一种逻辑运算使用的图片类型。 而鸿蒙中的Uri类型&#xff0c;本质其实是带file头的文件存储地址&#xff0c;是用来指向…...

【架构论文-2】架构设计中存在的问题和改进方向

一、性能优化相关 当前情况 在高负载情况下&#xff0c;系统的响应时间出现了一定程度的延迟。特别是在业务高峰期&#xff0c;大量并发请求导致部分关键业务模块的处理效率降低&#xff0c;影响了用户体验。改进方向 计划引入性能分析工具对系统进行全面的性能剖析&#xff0…...