map 简单梳理【GO 基础】
〇、map 简介
map 是一种无序的基于 key-value 的数据结构,Go 语言中的 map 是引用类型,必须初始化才能使用。
其中键可以是任何类型,但值必须是可比较的类型(如整数、字符串、布尔值等)。
一、map 的定义和使用
1.1 map 的定义
map[KeyType]ValueType
// KeyType:表示键的类型
// ValueType:表示键对应的值的类型
map 类型的变量默认初始值为 nil,需要使用 make() 函数来分配内存。语法为:
make(map[KeyType]ValueType, [cap])
// cap:表示 map 的容量,非必须
1.2 map 的基本使用
map 中的数据都是成对出现的,map 的基本使用示例代码如下:
package main
import "fmt"
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["李四"])
fmt.Printf("type of scoreMap : %T\n", scoreMap)
// 声明时直接赋值
userInfo := map[string]bool{
"王五": true,
}
fmt.Println(userInfo)
fmt.Printf("type of userInfo : %T\n", userInfo)
}

1.3 判断某个键是否存在
Go 语言中有个判断 map 中键是否存在的特殊写法,格式如下:
value, ok := map[key]
// 若 key 存在,则 ok = true,value 为对应的值,否则 ok = false
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
value, ok := scoreMap["张三"]
if ok {
fmt.Println(value)
} else {
fmt.Println("查无此人")
}
value2, ok := scoreMap["张三1"]
if ok {
fmt.Println(value2)
} else {
fmt.Println("查无此人")
}
}

1.4 map 的遍历
Go 语言中使用 for range 遍历 map。
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
scoreMap["王五"] = 60
for k, v := range scoreMap { // 只想遍历 k 时,v 可省略
fmt.Println(k, v)
}
}

注意:遍历 map 时的元素顺序与添加键值对的顺序无关。
1.5 通过 delete 删除键值对
使用 delete() 内建函数从 map 中删除一组键值对,delete() 函数的格式如下:
delete(map, key)
// map 表示要从中删除键值对的 map 对象名
// key 表示要删除的键
package main
import "fmt"
func main() {
scoreMap := make(map[string]int)
scoreMap["张三"] = 90
scoreMap["李四"] = 100
scoreMap["王五"] = 60
delete(scoreMap, "李四")
for k, v := range scoreMap {
fmt.Println(k, v)
}
}

1.6 按照指定顺序遍历 map
map 本身是无序的,如果想按照顺序来遍历,可以将全部的 key 取出来自行排序,最后对这个排序后的键列表进行遍历,每次通过键取 map 中的值。如下示例代码:
package main
import (
"fmt"
"math/rand"
"sort"
)
func main() {
var scoreMap = make(map[string]int, 20)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("stu%02d", i) // 生成 stu 开头的字符串
value := rand.Intn(100) // 生成 0~99 的随机整数
scoreMap[key] = value
}
// 取出 map 中的所有 key 存入切片 keys
var keys = make([]string, 0, 200)
for key := range scoreMap {
keys = append(keys, key)
}
// 对切片进行排序
sort.Strings(keys)
// 按照排序后的 key 遍历 map
for _, key := range keys {
fmt.Println(key, scoreMap[key])
}
}

1.7 元素可以是 map 类型的切片
package main
import (
"fmt"
)
func main() {
var mapSlice = make([]map[string]string, 3) // 初始化一个 map 列表,长度为 3 的
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
fmt.Println("after init")
// 对切片中的 map 元素进行初始化
mapSlice[0] = make(map[string]string, 10) // 初始化第一个切片的值为长度是 10 的 map,然后后续再进行赋值
mapSlice[0]["name"] = "王五"
mapSlice[0]["password"] = "123456"
mapSlice[0]["address"] = "红旗大街"
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
}

1.8 值为切片类型的 map
package main
import (
"fmt"
)
func main() {
var sliceMap = make(map[string][]string, 3) // 初始化一个长度为 3 的 map
fmt.Println(sliceMap)
fmt.Println("after init")
key := "中国"
value, ok := sliceMap[key]
if !ok {
value = make([]string, 0, 2)
}
value = append(value, "北京", "上海") // 往 value 中添加值
sliceMap[key] = value
fmt.Println(sliceMap)
}

参考:http://www.topgoer.com/go%E5%9F%BA%E7%A1%80/Map.html
map 简单梳理【GO 基础】的更多相关文章
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- C#正则表达式_简单梳理_Emoji表情字符处理
A-最近一直有接触到正则表达式,现对其做简单梳理: private const RegexOptions OPTIONS = RegexOptions.IgnoreCase | RegexOption ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- C++关联容器<map>简单总结
C++关联容器<map>简单总结 map提供大小可变的关联容器,基于关联键值高效检索元素值.当你处理键值对的数据是,都可以考虑使用map关联容器. 特点: 大小可变的关联容器,基于关联键值 ...
- 【RL-TCPnet网络教程】第38章 TFTP简单文件传输基础知识
第38章 TFTP简单文件传输基础知识 本章节为大家讲解TFTP(Trivial File Transfer Protocol,简单文件传输协议)的基础知识,方便后面章节的实战操作. (本章 ...
- Jmeter 接口测试知识梳理——应用基础篇
Jmeter 使用也有很长时间了,但是一直没有做一下知识梳理,近期会对公司同事做一下这方面的培训,借此机会,把使用过程中应用到的知识,或是遇到的问题,整理出来,方便大家学习! Jmeter 接口测试知 ...
- Memcached概念、作用、运行原理、特性、不足简单梳理(1)
大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过.这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现 ...
- C#基础知识简单梳理
本文是转发博友的总结,方便自己以后随时温习: 1.值类型和引用类型 1.1堆和栈 简单的说值类型存放在堆栈上面,引用类型的数据存放在托管堆上面(它的引用地址却存放在堆栈上面)! 栈:它是一个内存数组, ...
- 简单梳理下 Vue3 的新特性
在 Vue3 测试版刚刚发布的时候,我就学习了下 Composition API,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...
随机推荐
- HTMl插入视频背景
插入视频背景一段简单的css即可 首先定义HTML的video标签 <video src="视频路径" class="bjimg" autoplay lo ...
- TienChin 渠道管理-添加渠道页面开发
略过,前面已将渠道管理的 index.vue 文件内容全部粘贴给你们了.
- 【深度学习项目三】ResNet50多分类任务【十二生肖分类】
相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...
- Redis订阅模式在生产环境引起的内存泄漏
内存泄漏 内存泄漏指的就是在运行过程中定义的各种各样的变量无法被垃圾回收器正常标记为不可达并触发后续的回收流程,主要原因还是因为对可回收对象引用没有去除,导致垃圾回收器通过GC ROOT可达性分析时认 ...
- 在K8S中,Pod亲和性概念是什么?
在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(Affinity and Anti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置 ...
- 普及模拟2 +【LGR-155-Div.3】洛谷基础赛 #3 &「NnOI」Round 2
普及模拟2 \(T1\) 地址 \(0pts\) 简化题意:判断一个 \(IP\) 地址是否合法(数据保证字符串中存在且仅存在4个被字符分开的整数),若不合法则将其改正. 部分分: \(0pts\) ...
- NVME(学习笔记七)—Atomicity Operation
5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...
- 【Unity3D】Photon环境搭建
1 简介 Photon 是一个泛用性的 ScoketServer 套装软件,可用于多人在线游戏.聊天室.大厅游戏,并同时支持 Windows.Unity3D.iOS.Android.Flash 等 ...
- Dota2参议院
Dota2参议院 Dota2的世界里有两个阵营:Radiant天辉和Dire夜魇 Dota2参议院由来自两派的参议员组成.现在参议院希望对一个Dota2游戏里的改变作出决定.他们以一个基于轮转过程的投 ...
- Js模块化导入导出
Js模块化导入导出 CommonJs.AMD.CMD.ES6都是用于模块化定义中使用的规范,其为了规范化模块的引入与处理模块之间的依赖关系以及解决命名冲突问题,并使用模块化方案来使复杂系统分解为代码结 ...