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

10.Go 映射

映射(map)是一种特殊的数据结构,用于存储一系列无序的键值对,映射基于键来存储数据。映射功能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。与C++、Java中的映射的不同之处在于,Go语言使用映射不需要引入任何库,而C++、Java需要先引用相应的库,因此,Go语言的映射使用起来更加方便。

1、映射的创建

语法格式:var mapname map[keytype]valuetype

  • mapname为map的变量名。
  • keytype为键类型。
  • valuetype为键对应的值类型

注意:[keytype]和valuetype之间允许有空格。

在声明映射时不需要知道map的长度,因为map是可以动态增长的,未初始化的map的值是nil,使用函数len()可以获取map中键值对的数目。

在Go语言中,最常用的创建并初始化映射的方法有两种:

  • 使用内置的make()函数创建映射。
  • 使用字面量创建映射。
// make() 创建一个映射,键的类型是string,值的类型是int
dict := make(map[string]int)// 字面量创建一个映射,键和值的类型都是string,使用两个键值对初始化映射
dict := map[string]string{ "red": "#da1337","orange": "#e95a22"}
  • 使用映射字面量是更常用的方法,映射的初始长度会根据初始化时指定的键值对的数量来确定。
  • 映射的键可以是任何值,这个值的类型并不限制,内置的类型或者结构类型都可以,不过需要确定这个值可以使用“==”运算符做比较。
  • 需要注意的是,切片、函数及包含切片的结构类型由于具有引用语义,均不能作为映射的键,使用这些类型会造成编译错误,

  • 可以使用切片作为映射的值
// 创建一个映射,使用字符串切片作为值
dict := map[int][]string {}
2、映射的遍历

map的遍历过程可以通过使用for range循环来完成:

func main() {scene := make(map[string]int)scene["route"] = 66scene["brazil"] = 4scene["china"] = 1for k, v := range scene {fmt.Println(k, v)}// 只遍历值for _, v := range scene {fmt.Println(v)}	// 只遍历键for k := range scene {fmt.Println(k)}
}
  • 只遍历值,将不需要的键修改为匿名变量的形式即可。
  • 只遍历键,无须将值修改为匿名变量的形式。

需要特定顺序的遍历结果,正确的做法是先排序:

func main() {scene := make(map[string]int)scene["route"] = 66scene["brazil"] = 4scene["china"] = 1var sceneList []stringfor k := range scene {sceneList = append(sceneList, k)}// 对切片进行排序sort.Strings(sceneList)// 输出fmt.Print(sceneList) // [brazil china route]
}
3、映射的删除

Go语言中并没有为map提供任何清空所有元素的函数、方法,清空map的唯一办法就是重新使用make()函数构建一个新的map,不用担心垃圾回收的效率,这是因为Go语言中的并行垃圾回收效率比写一个清空函数要高效得多。

使用delete()内置函数从map中删除一组键值对,delete()函数的语法格式如下:delete(map, 键)

func main() {scene := make(map[string]int)scene["route"] = 66scene["brazil"] = 4scene["china"] = 1delete(scene, "brazil")for k, v := range scene {fmt.Println(k, v)}
}
4、映射的特性

(1)map的单个键值访问格式为mapName[key],更新某个key的值时mapName[key]放到等号左边,访问某个key的值时mapName[key]放在等号右边。

(2)可以使用range遍历一个map类型变量,但是不保证每次迭代元素的顺序。

(3)删除map中的某个键值,语法如下:delete(mapName,key) delete是内置函数,用来删除map中的某个键值对。

(4)可以使用内置的len()函数返回map中的键值对数量。

(5)Go内置的map不是并发安全的,并发安全的map可以使用标准包sync中的map。

(6)不能直接修改map value内某个元素的值,如果想修改map的某个键值,则必须整体赋值。

相关文章:

  • libp2p服务发现之 Multicast DNS(mDNS)
  • 【音视频】remb twcc原理
  • Npm使用技巧
  • MyBatis的动态SQL
  • Qt前端技术:5.QSS
  • 基于ssm出租车管理系统的设计与实现论文
  • 移动开发git版本控制经验之谈
  • npm使用详解(好吧好吧是粗解)
  • YZ系列工具之YZ03:高版本Excel的自定义菜单
  • B树和B+树的区别
  • 在树莓派Ubuntu 23.10上编译opencv3.4.14
  • 手把手教你使用 PyTorch 搭建神经网络
  • 前端必备的 web 安全知识手记
  • 解决ios编译swift报错pcm was built: mtime changed
  • idea 注入mapper报错报红的几种解决方案
  • hexo+github搭建个人博客
  • .pyc 想到的一些问题
  • [LeetCode] Wiggle Sort
  • 【Leetcode】104. 二叉树的最大深度
  • 【Linux系统编程】快速查找errno错误码信息
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • angular组件开发
  • JSONP原理
  • Magento 1.x 中文订单打印乱码
  • mongo索引构建
  • mysql innodb 索引使用指南
  • tensorflow学习笔记3——MNIST应用篇
  • VuePress 静态网站生成
  • 阿里云购买磁盘后挂载
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 对超线程几个不同角度的解释
  • - 概述 - 《设计模式(极简c++版)》
  • 目录与文件属性:编写ls
  • 嵌入式文件系统
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一道面试题引发的“血案”
  • 一文看透浏览器架构
  • 移动端唤起键盘时取消position:fixed定位
  • 异常机制详解
  • 怎么将电脑中的声音录制成WAV格式
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 大数据全解:定义、价值及挑战
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​力扣解法汇总946-验证栈序列
  • #pragma data_seg 共享数据区(转)
  • #pragma once与条件编译
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • ()、[]、{}、(())、[[]]命令替换
  • (二)正点原子I.MX6ULL u-boot移植
  • (二十三)Flask之高频面试点
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis持久化