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

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) {//用户选择的路径&#xff0c;可以是TCHAR szBuffer[MAX_PATH] {0};然后再使用TCHAR 转char字符串&#xff0c;此处可以直接使…...

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 文件其他&#xff1a;别名二、项目配置2.1 build2.2 cs…...

单链表的头插,尾插,头删,尾删等操作

前言顺序表要求是具有连续的物理空间&#xff0c;并且数据的话是在这些空间当中是连续的存储。但这样会带来很多问题&#xff0c;比如说在头部或者说中间插入的话&#xff0c;效率不是很高&#xff1b;并且申请空间可能需要扩容&#xff0c;并且越往后一般来说都是异地扩容&…...

Qt扫盲-QProcess理论总结

QProcess理论使用总结一、概述二、使用三、通过 Channel 通道通信四、同步进程API五、注意事项1. 平台特性2. 不能实时读取一、概述 QProcess 其实更多的是与外面进程进行交互的一个工具类&#xff0c;通过这个类来启动外部进程&#xff0c;获取这个进程的标准输出&#xff0c…...

JAVA进阶 —— Steam流

目录 一、 引言 二、 Stream流概述 三、Stream流的使用步骤 1. 获取Stream流 1.1 单列集合 1.2 双列集合 1.3 数组 1.4 零散数据 2. Stream流的中间方法 3. Stream流的终结方法 四、 练习 1. 数据过滤 2. 数据操作 - 按年龄筛选 3. 数据操作 - 演员信息要求…...

Ubuntu Protobuf 安装(测试有效)

安装流程 下载软件 下载自己要安装的版本&#xff1a;https://github.com/protocolbuffers/protobuf 下载源码编译&#xff1a; 系统环境&#xff1a;Ubuntu16&#xff08;其它版本亦可&#xff09;&#xff0c;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 点击右键&#xff0c;选择SVN Checkout 2.3输入网址 如当你在网页上访问时地址为https://10.197.78.78/!/#aaa/view/head/bbb 在这里不能直接填入&#xff0c;而是 https://10.197.78.78/sv…...

ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;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 整除

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你一个正整数数组 nums&#xff0c;请你移除 最短 子数组&#xff08;可以为 …...

Spring源码阅读(基础)

第一章&#xff1a;bean的元数据 1.bean的注入方式&#xff1a; 1.1 xml文件 1.2 注解 Component&#xff08;自己写的类才能在上面加这些注解&#xff09; 1.3配置类&#xff1a; Configuration 注入第三方数据源之类 1.4 import注解 &#xff08;引用了Myselector类下…...

服务搭建篇(九) 使用GitLab+Jenkins搭建CI\CD执行环境 (上) 基础环境搭建

1.前言 每当我们程序员开发在本地完成开发之后 , 都要部署到正式环境去使用 , 在一些传统的运维体系中 , 开发与运维都是割裂的 , 开发人员不允许操作正式服务器 , 服务器只能通过运维团队来操作 , 这样可以极大的提高服务器的安全性 , 不经过安全保护的开放服务器 , 对于黑客…...

CDC 长沙站丨云原生技术研讨会:数字兴链,云化未来!

一、活动信息&#xff1a;活动主题&#xff1a;CDC 长沙站丨云原生技术研讨会活动时间&#xff1a;2023 年 3 月 14 日下午 14&#xff1a;30-17&#xff1a;30活动地点&#xff1a;长沙市岳麓区-拓维信息总部 1 楼多功能厅活动参与方式&#xff1a;免门票参与&#xff0c;戳此…...

A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)

推荐参考文章: A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[一](基于距离的翻译模型:TransE、TransH、TransR、TransH、TransA、RotatE) A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法) A.…...

香港酒店模拟分析项目报告--使用tableau、python、matlab

转载请标记本文出处 软件&#xff1a;tableau、pycharm、关系型数据库&#xff1a;MySQL 数据大量分析考虑电脑性能的情况。 文章目录前言一、爬虫是什么&#xff1f;二、使用tableau数据可视化1.引入数据1.1 制作直方图-各地区酒店数量条形图1.2 各地区酒店均价1.3 价格等级堆…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

前端导出带有合并单元格的列表

// 导出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 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...