Go语言容器之map、list和nil
一、map
- map和C++中map一样,里面存放的是key-value键值对
- 在Go中map是引用类型,声明语法:var map变量名 map[key的类型]value的类型
结果:package mainimport "fmt"func main() {var mp map[string]intmpls := map[string]int{"one":1, "two":2, "three":3}mpmk := make(map[string]int)mp = mplsmpmk["语文"] = 1mpmk["数学"] = 2mpmk["英语"] = 4mp["four"] = 4mp["five"] = 5fmt.Println("mp[one]", mp["one"])fmt.Println("mp[ten]", mp["ten"])fmt.Println("mp", mp)fmt.Println("mpmk[语文]", mpmk["语文"])fmt.Println(mpmk) }

1.map的容量
- 和数组不一样,map可以根据新增的key-value进行动态的增加删除,所以不存在长度、最大限制;但是可以选择标明map的初始容量capacity,格式如下:
make(map[key类型]value类型, cap)
2.map的遍历
- 遍历map可以用for循环语句和range关键字进行遍历
结果:package mainimport "fmt"func main() {mpls := map[string]int{"one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9, "ten":10}//遍历mapfor key, value := range mpls{fmt.Printf("key:%s",key)fmt.Printf(": value:%d\n", value)fmt.Println("value:", mpls[key])}fmt.Println("只遍历key:")//只遍历keyfor key, _ := range mpls{fmt.Printf("key:%s ", key)}fmt.Println("\n只遍历value:")//只遍历valuefor _, value := range mpls{fmt.Printf("value:%d ", value)} }

3.map中元素的删除
- delete(map变量名, key对应的键)
结果:package mainimport "fmt"func main() {mpls := map[string]int{"one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9, "ten":10}//遍历mapfor key, value := range mpls{fmt.Printf(" key: %s, value: %d||",key, value)}delete(mpls, "five")delete(mpls,"nine")delete(mpls,"three")fmt.Println("\n删除后:")fmt.Println(mpls) }
4.并发map(sync.Map)
- Go语言中,map在并发情况下,只读是线程安全的,但是同时读写线程是不安全的
- 需要并发读写的时候,一般是用加锁的方式。go中有一个效率高的并发安全的map,即snyc.Map。
- sync.Map有以下特征:
(1)无须初始化,直接声明即可
(2)sync.Map和map不一样,不可以用map的方式对其进行操作。而是有自己特有的方式,Store表示存储,Load表示获取,Delete表示删除
(3)使用Range配合一个回调函数进行遍历错做,通过回调函数返回内部遍历出来的值,Range参数中回调函数的返回值在需要继续迭代遍历时,返回true,终止遍历时返回false - 举例:
结果:package mainimport ("fmt""sync" )func main() {var snmp sync.Map//存储数据snmp.Store("语文", 100)snmp.Store("数学", 130)snmp.Store("英语", 120)snmp.Store("生物", 90)snmp.Store("物理", 30)//查看数据fmt.Println(snmp.Load("生物"))fmt.Println(snmp.Load("数学"))//删除数据snmp.Delete("生物")//遍历snmp.Range(func(k, v interface{})bool{fmt.Println("iterate:", k, v)return true}) }

二、list
- 在Go中,列表list内部的实现原理是双链表,能够高效地进行任意位置元素的插入和删除操作
1.列表的初始化
- 方式一:通过container/list包中的New()函数来进行初始化。变量名 := list.New()
- 方式二:通过var关键字声明初始化list。var 变量名 list.List
2.列表的插入、删除
- 向列表中插入元素,因为是双链表,可以从队尾、队首两头直接插。PushFront向队首前方插入元素,PushBack向队尾后方插入元素,InsertAfter在队列中某元素之后插入一个元素,InsertBefore在队列某元素之前插入一个元素
- Remove移除某个元素
package mainimport ("container/list""fmt"
)func main() {ls := list.New()ls.PushFront("d")//队首添加dele2 := ls.PushBack("e")//队尾添加e。且存放e元素的句柄。队列:d->eele1 := ls.PushFront("c")//队首添加c。且存放c元素的句柄。队列:c->d->els.PushBack("g")//队尾添加f。队列:c->d->e->gls.PushFront("a")//队首添加a。队列:a->c->d->e->g//遍历队列:for i := ls.Front(); i != nil; i = i.Next(){fmt.Printf(" %v -> ", i.Value)}fmt.Println()ls.InsertBefore("b", ele1)//在c元素前面添加b。队列:a->b->c->d->e->gls.InsertAfter("f", ele2)//在e元素后面添加f。队列:a->b->c->d->e->f->gele3 := ls.InsertAfter("i", ele2)//在e元素后面添加i。队列:a->b->c->d->e->i->f->g//遍历队列:for i := ls.Front(); i != nil; i = i.Next(){fmt.Printf(" %v -> ", i.Value)}ls.Remove(ele3)//删除元素ifmt.Println()//遍历队列:for i := ls.Front(); i != nil; i = i.Next(){fmt.Printf(" %v -> ", i.Value)}
}
结果:

三、零值、空值nil
- 在Go语言中,布尔类型的零值(初始化值)为false,数值类型的零值为0,字符串类型的零值为空字符串"",而指针、切片、映射、通道和接口类型的零值都是nil空值
- Go中,nil是一个预定义好的标识符。
1.nil的特性
(1)nil是不能比较的,无论nil的类型是否相同也都不能进行比较,会编译报错
package mainimport "fmt"func main() {fmt.Println(nil == nil)
}
结果:
(2)nil不是关键字或者保留字
(3)nil没有默认的类型
(4)不同类型的nil的指针是一样的
package mainimport ("fmt"
)func main() {var arr[]intvar mp map[int]intvar num intfmt.Printf("%p\n", arr)fmt.Printf("%p\n", mp)fmt.Printf("%p\n", num)
}
结果:

(5)nil是指针、切片、map、channel、接口、函数的零值
package mainimport ("fmt"
)func main() {var ptr *stringvar slce []intvar arr[]intvar mp map[int]intvar cha chan intvar fn func()var ins interface{}fmt.Printf("%#v\n", ptr)fmt.Printf("%#v\n", slce)fmt.Printf("%#v\n", arr)fmt.Printf("%#v\n", mp)fmt.Printf("%#v\n", cha)fmt.Printf("%#v\n", fn)fmt.Printf("%#v\n", ins)
}
结果:

(6)不同类型的nil值占用的内存大小不一样,按照类型大小
package mainimport ("fmt""unsafe"
)func main() {var ptr *stringvar slce []intvar arr[]intvar mp map[int]intvar cha chan intvar fn func()var ins interface{}fmt.Println(unsafe.Sizeof(ptr))fmt.Println(unsafe.Sizeof(slce))fmt.Println(unsafe.Sizeof(arr))fmt.Println(unsafe.Sizeof(mp))fmt.Println(unsafe.Sizeof(cha))fmt.Println(unsafe.Sizeof(fn))fmt.Println(unsafe.Sizeof(ins))
}
结果:

四、make和new关键字的区别
- 两个内置函数可以用来在堆上分配内存
- make只能用来分配和初始化slice、map、chan的类型的数据,而new可以分配任意类型的数据
- make分配数据内存返回的是引用,即Type,而new返回一个指向接收参数类型的指针,即*Type。(make 关键字的主要作用是创建 slice、map 和 Channel 等内置的数据结构,而 new 的主要作用是为类型申请一片内存空间,并返回指向这片内存的指针。
) - 接收参数个数不一样:make() 只接收一个参数,而 new() 可以接收多个参数
- make分配的空间后,会进行初始化。而new分配的空间会清零
相关文章:
Go语言容器之map、list和nil
一、map map和C中map一样,里面存放的是key-value键值对在Go中map是引用类型,声明语法:var map变量名 map[key的类型]value的类型package mainimport "fmt"func main() {var mp map[string]intmpls : map[string]int{"one&quo…...
软件测试的案例分析 - 闰年1
(这是关于博客质量分的测试 https://www.csdn.net/qc) 我们谈了不少测试的名词, 软件是人写的, 测试计划和测试用例也是人写的, 人总会犯错误。错误发生之后, 总有人问: 为什么这个bug 没有测出来啊?! 我们看看一类简单的bug是如何发生的,以及如何预防…...
【强化学习】强化学习数学基础:值函数近似
值函数近似Value Function ApproximationMotivating examples: curve fittingAlgorithm for state value estimationObjective functionOptimization algorithmsSelection of function approximatorsIllustrative examplesSummary of the storyTheoretical analysisSarsa with …...
JVM系列——Java与线程,介绍线程原理和操作系统的关系
并发不一定要依赖多线程(如PHP中很常见的多进程并发)。 但是在Java里面谈论并发,基本上都与线程脱不开关系。因此我们讲一下从Java线程在虚拟机中的实现。 线程的实现 线程是比进程更轻量级的调度执行单位。 线程的引入,可以把一个进程的资源分配和执行调…...
C++打开文件夹对话框之BROWSEINFO
头文件 #include <shlobj.h> #include <windows.h> #include <stdio.h> using namespace std; 案例 string chooseFile(void) {//用户选择的路径,可以是TCHAR szBuffer[MAX_PATH] {0};然后再使用TCHAR 转char字符串,此处可以直接使…...
Nuxt项目配置、目录结构说明-实战教程基础-Day02
Nuxt项目配置、目录结构说明-实战教程基础-Day02一、Nuxt项目结构1.1资源目录1.2 组件目录1.3 布局目录1.4 中间件目录1.5 页面目录1.6 插件目录1.7 静态文件目录1.8 Store 目录1.9 nuxt.config.js 文件1.10 package.json 文件其他:别名二、项目配置2.1 build2.2 cs…...
单链表的头插,尾插,头删,尾删等操作
前言顺序表要求是具有连续的物理空间,并且数据的话是在这些空间当中是连续的存储。但这样会带来很多问题,比如说在头部或者说中间插入的话,效率不是很高;并且申请空间可能需要扩容,并且越往后一般来说都是异地扩容&…...
Qt扫盲-QProcess理论总结
QProcess理论使用总结一、概述二、使用三、通过 Channel 通道通信四、同步进程API五、注意事项1. 平台特性2. 不能实时读取一、概述 QProcess 其实更多的是与外面进程进行交互的一个工具类,通过这个类来启动外部进程,获取这个进程的标准输出,…...
JAVA进阶 —— Steam流
目录 一、 引言 二、 Stream流概述 三、Stream流的使用步骤 1. 获取Stream流 1.1 单列集合 1.2 双列集合 1.3 数组 1.4 零散数据 2. Stream流的中间方法 3. Stream流的终结方法 四、 练习 1. 数据过滤 2. 数据操作 - 按年龄筛选 3. 数据操作 - 演员信息要求…...
Ubuntu Protobuf 安装(测试有效)
安装流程 下载软件 下载自己要安装的版本:https://github.com/protocolbuffers/protobuf 下载源码编译: 系统环境:Ubuntu16(其它版本亦可),Protobuf-3.6.1 编译源码 cd protobuf# 当使用 git clone 下来的…...
驱动程序开发:FTP服务器和OpenSSH的移植与搭建、以及一些笔记
目录一、FTP服务器移植与搭建1、在ubuntu下安装vsftpd2、在window下安装FileZilla3、移植vsftpd到开发板上4、Filezilla 连接测试5、注意点二、开发板 OpenSSH 移植与使用1、移植 zlib 库2、移植 openssl 库3、移植 openssh 库4、openssh 使用测试三、关于u-boot上的操作及根文…...
优化改进YOLOv5算法之添加GIoU、DIoU、CIoU、EIoU、Wise-IoU模块(超详细)
目录 1、IoU 1.1 什么是IOU 1.2 IOU代码 2、GIOU 2.1 为什么提出GIOU 2.2 GIoU代码 3 DIoU 3.1 为什么提出DIOU 3.2 DIOU代码 4 CIOU 4.1 为什么提出CIOU 4.2 CIOU代码 5 EIOU 5.1 为什么提出EIOU 5.2 EIOU代码 6 Wise-IoU 7 YOLOv5中添加GIoU、DIoU、CIoU、…...
windows电脑pc如何使用svn获取文档和代码
一、安装svn 下载链接 也可通过其他方式下载 二、使用 2.1 随便找一个文件夹 2.2 点击右键,选择SVN Checkout 2.3输入网址 如当你在网页上访问时地址为https://10.197.78.78/!/#aaa/view/head/bbb 在这里不能直接填入,而是 https://10.197.78.78/sv…...
ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)
参考B站古月居ROS入门21讲:tf坐标系广播与监听的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、创建功能包二、创建代码2.1 以C为例2.1.1 配置代码编译规则2.1.2 编译整个工作空间2.1.2 配置环境变量2.1.4 执行代码2.2 以Python为例2.2.1 配置代码…...
力扣解法汇总1590. 使数组和能被 P 整除
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 …...
Spring源码阅读(基础)
第一章:bean的元数据 1.bean的注入方式: 1.1 xml文件 1.2 注解 Component(自己写的类才能在上面加这些注解) 1.3配置类: Configuration 注入第三方数据源之类 1.4 import注解 (引用了Myselector类下…...
服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建
1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的运维体系中 , 开发与运维都是割裂的 , 开发人员不允许操作正式服务器 , 服务器只能通过运维团队来操作 , 这样可以极大的提高服务器的安全性 , 不经过安全保护的开放服务器 , 对于黑客…...
CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!
一、活动信息:活动主题:CDC 长沙站丨云原生技术研讨会活动时间:2023 年 3 月 14 日下午 14:30-17:30活动地点:长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式:免门票参与,戳此…...
A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)
推荐参考文章: A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[一](基于距离的翻译模型:TransE、TransH、TransR、TransH、TransA、RotatE) A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法) A.…...
香港酒店模拟分析项目报告--使用tableau、python、matlab
转载请标记本文出处 软件:tableau、pycharm、关系型数据库:MySQL 数据大量分析考虑电脑性能的情况。 文章目录前言一、爬虫是什么?二、使用tableau数据可视化1.引入数据1.1 制作直方图-各地区酒店数量条形图1.2 各地区酒店均价1.3 价格等级堆…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
