Go 语言中如何高效地处理集合
文章精选推荐
1 JetBrains Ai assistant 编程工具让你的工作效率翻倍
2 Extra Icons:JetBrains IDE的图标增强神器
3 IDEA插件推荐-SequenceDiagram,自动生成时序图
4 BashSupport Pro 这个ides插件主要是用来干嘛的 ?
5 IDEA必装的插件:Spring Boot Helper的使用与功能特点
6 Ai assistant ,又是一个写代码神器
文章正文
在 Go 语言中,处理集合(如切片、映射等)时,可以通过多种方式提高效率。以下是一些常见的高效处理集合的方法,结合详细的代码例子进行讲解。
1. 使用切片(Slice)代替数组
切片是 Go 中常用的集合类型,它比数组更灵活,因为切片的长度是可变的。
package mainimport "fmt"func main() {// 创建一个切片numbers := []int{1, 2, 3, 4, 5}// 添加元素numbers = append(numbers, 6)// 遍历切片for i, num := range numbers {fmt.Printf("Index: %d, Value: %d\n", i, num)}
}
2. 使用 map 进行快速查找
map 是 Go 中的一种键值对集合,适合用于快速查找和去重。
package mainimport "fmt"func main() {// 创建一个 mapages := map[string]int{"Alice": 30,"Bob": 25,"Carol": 28,}// 查找元素if age, ok := ages["Bob"]; ok {fmt.Printf("Bob's age is %d\n", age)} else {fmt.Println("Bob not found")}// 添加元素ages["Dave"] = 32// 删除元素delete(ages, "Carol")// 遍历 mapfor name, age := range ages {fmt.Printf("%s is %d years old\n", name, age)}
}
3. 使用 sync.Map 进行并发安全的操作
如果需要在并发环境下操作集合,可以使用 sync.Map,它是 Go 提供的并发安全的映射。
package mainimport ("fmt""sync"
)func main() {var m sync.Map// 存储元素m.Store("key1", "value1")m.Store("key2", "value2")// 加载元素if value, ok := m.Load("key1"); ok {fmt.Println("key1:", value)}// 删除元素m.Delete("key2")// 遍历 mapm.Range(func(key, value interface{}) bool {fmt.Println(key, value)return true})
}
4. 使用 sort 包对切片进行排序
Go 的 sort 包提供了对切片进行排序的功能。
package mainimport ("fmt""sort"
)func main() {// 创建一个切片numbers := []int{5, 2, 9, 1, 5, 6}// 对切片进行排序sort.Ints(numbers)// 输出排序后的切片fmt.Println(numbers)
}
5. 使用 container 包中的数据结构
Go 的 container 包提供了堆、链表和环形链表等数据结构,适合特定场景下的集合操作。
package mainimport ("container/heap""fmt"
)// 定义一个最小堆
type IntHeap []intfunc (h IntHeap) Len() int { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }func (h *IntHeap) Push(x interface{}) {*h = append(*h, x.(int))
}func (h *IntHeap) Pop() interface{} {old := *hn := len(old)x := old[n-1]*h = old[0 : n-1]return x
}func main() {h := &IntHeap{2, 1, 5}heap.Init(h)heap.Push(h, 3)fmt.Printf("minimum: %d\n", (*h)[0])for h.Len() > 0 {fmt.Printf("%d ", heap.Pop(h))}
}
6. 使用 copy 函数复制切片
copy 函数可以高效地复制切片,避免直接赋值导致的潜在问题。
package mainimport "fmt"func main() {// 创建一个切片src := []int{1, 2, 3, 4, 5}// 创建一个目标切片dst := make([]int, len(src))// 复制切片copy(dst, src)// 输出目标切片fmt.Println(dst)
}
7. 使用 make 预分配切片和映射的容量
预分配容量可以减少动态扩容带来的性能开销。
package mainimport "fmt"func main() {// 预分配切片的容量numbers := make([]int, 0, 10) // 长度为0,容量为10numbers = append(numbers, 1, 2, 3)// 预分配映射的容量ages := make(map[string]int, 100) // 容量为100ages["Alice"] = 30fmt.Println(numbers, ages)
}
8. 使用 defer 和 sync.WaitGroup 进行并发处理
在并发处理集合时,可以使用 sync.WaitGroup 来等待所有 goroutine 完成。
package mainimport ("fmt""sync"
)func process(num int, wg *sync.WaitGroup) {defer wg.Done()fmt.Println("Processing:", num)
}func main() {var wg sync.WaitGroupnumbers := []int{1, 2, 3, 4, 5}for _, num := range numbers {wg.Add(1)go process(num, &wg)}wg.Wait()fmt.Println("All goroutines finished")
}
总结
在 Go 语言中,处理集合时可以通过使用切片、映射、并发安全的数据结构、排序、预分配容量等方式来提高效率。根据具体的应用场景选择合适的数据结构和处理方法,可以显著提升程序的性能。
相关文章:
Go 语言中如何高效地处理集合
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
布隆过滤器到底是什么东西?它有什么用
布隆过滤器:用概率换空间的奇妙数据结构 引言:当空间成为奢侈品 在互联网每天产生2.5万亿字节数据的时代,Google每秒处理超过9万次搜索请求,Redis缓存系统支撑着百万级QPS的访问。面对如此海量的数据处理需求,传统的…...
【数据结构初阶第十节】队列(详解+附源码)
好久不见。。。别不开心了,听听喜欢的歌吧 必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time! ————————————《有没…...
沪深300股指期权能对股指期货进行完全套保吗?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 沪深300股指期权能对股指期货进行完全套保吗? 沪深300股指期权是以沪深300指数为标的物的期权,而沪深300股指期货则是以该指数作为标的的期货合约。 理…...
JAVA学习第三天
继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别: super父类构造函数的使用: 使用子类构造函数时,都会初始化父类的数据,自动调用父类的无参构造函数 super内存图——007 继…...
win11电脑其他WiFi可以连,只有一个WiFi连不上
这个问题卡了一小会,查了一些资料 后面发现 点击“诊断网络问题” 显示没有响应 第一步 重启wlan网络适配器 解决!!! 重新连接那个有问题的wifi,丝滑连接!...
leetcode_1760 袋子里最少数目的球
1. 题意 给定一个数组,和一个最多次操作次数。每次操作可以将数组中的一个数 x x x分成两个数 t x − t t\quad x-t tx−t。问 m a x O p e r a t i o n C n t maxOperationCnt maxOperationCnt次操作后,数组中最大的数最小的值是多少。 2. 题解 这个…...
Python 面向对象的三大特征
前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…...
Linux下的进程切换与调度
目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候,通常会启动多个程序,这些程序最后都会变成进程,但是我们的硬…...
面向对象程序设计-实验六
7-1 函数重载(数据类型不同) 代码清单: #include<iostream> using namespace std; class axxx { public: void px(int n,int a[]) { for(int i0;i<n;i) { for(int j0;j<n-i-1;j) { int t; if(a[j]>a[j1]) { ta[j]; a[j…...
MongoDB 7 分片副本集升级方案详解(上)
#作者:任少近 文章目录 前言:Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言:Mongodb版本升级 在开始升级之前,请参阅 MongoDB下个版本中的兼容性变更文档,以确保您的应用程序和…...
【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞
文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1:代码分析 4.2:流量分析 5.poc代码: 1.漏洞描述 漏洞编号:CVE-2022-35555 漏洞名称:Tenda W6 命令注入 威胁等级:高危 漏洞详情࿱…...
算法分析 ——《模拟》
文章目录 《替换所有的问号》题目描述:代码演示:代码解析: 《提莫攻击》题目描述:代码演示:代码解析: [《Z 字形变换》](https://leetcode.cn/problems/zigzag-conversion/)题目描述:代码演示&a…...
将Sqlite3数据库挂在内存上处理
创作灵感:最近把小学生的口算题从2位数改到3位数,100以内四则运算练习(千纬数学)再次更新,选取难题-CSDN博客要不断刷题目,以前100以内的加减乘除也是这样刷出来的,代码如下: impor…...
前端大屏适配方案:从设计到实现的全流程指南
引言 随着数据可视化需求的增长,大屏展示项目在前端开发中越来越常见。然而,大屏开发面临独特的挑战: 屏幕分辨率多样:从1080P到4K甚至8K,如何保证清晰度?布局复杂:多图表、多组件如何合理排列…...
学习总结三十二
map #include<iostream> #include<map> using namespace std;int main() {//首先创建一个map对象map<int, char>oneMap;//插入数据oneMap.insert(pair<int, char>(1, A));oneMap.insert(make_pair(2,B));oneMap.insert(map<int,char>::value_ty…...
飞书专栏-TEE文档
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573...
linux 查看设备中的摄像头迅速验证设备号
通常,摄像头在系统中会被识别为/dev/video*设备文件,比如/dev/video0、/dev/video1等。用户可能有多个摄像头,比如内置摄像头和外接USB摄像头,这时候每个摄像头会被分配不同的设备号。 1. 列出所有摄像头设备 方法 1…...
2.8 企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南
企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南 引言:数据标注——AI模型的基石与瓶颈 据2024年AI行业报告显示,高质量标注数据的获取成本占模型开发总成本的62%,且标注错误导致的模型性能下降可达40%。本文将揭示如何结合大模型能力,构建支持千万级数…...
DeepSeek的蒸馏技术:让模型推理更快
DeepSeek系列模型,如DeepSeek-R1-Distill-Qwen-7B,采用了知识蒸馏(Knowledge Distillation)技术,这是一种强大的模型压缩和优化方法。通过蒸馏,DeepSeek模型在保持甚至提升性能的同时,实现了更快…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
