当前位置: 首页 > 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 价格等级堆…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...