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,但没想到正式版时隔一年多才出来,看了一下发现还是增加了不少新特性的,在这里我就将它们一一梳理一遍. 本文章只详细阐述 ...
随机推荐
- C# Contains()、 == 和Equals() 比较
目前在开发中前端页面有搜索条件 和后端的方法进行匹配 有一个Student表,其中有字段:name.age.address.tel CREATE TABLE Student ( Name varcha ...
- C++ Qt开发:TableWidget表格组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWi ...
- C/C++ 反汇编:针对加减乘除的还原
算术运算通常是指,加减乘除四则运算,而计算机中的四则运算与数学中的有所不同,同样是实现算术运算,高级语言与汇编语言的实现思路完全不同,往往一个简单的减法运算,都要几条指令的配合才能得出计算结果,而为了 ...
- npm sill idealTree buildDeps安装卡住问题
1.解决方式1 1.1设置淘宝镜像 npm config set registry http://registry.npm.taobao.org/ npm config get registry 参考 ...
- ElasticSearch7.3学习(十二)----type底层结构及弃用原因
1.type是什么 type,是一个index中用来区分类似的数据的.类似的数据,但是可能有不同的fields,而且有不同的属性来控制索引建立.分词器.field的value. 在底层的lucene中 ...
- 转载洛谷:23.08.19 普及模拟1 T1
Past 题目描述 所有人,都有一段支离破碎的过去. 你有\(n\)段过去的经历,有时顺利,有时不顺,于是你用一个评价值\(a_i\)来描述你的第\(i\)段经历,它们构成了长度为\(n\)的序列\( ...
- select * 的使用说明
一. SELECT * 的含义 select * 语句是从指定的表中按照顺序返回所有列. 二. SELECT * 的优缺点 1 优点 在实际开发过程中,大家习惯性地使用select * from ...
- Linux-数据集 TPC-H、TPC-DS的导入和使用(MySQL)
一. TPC-H 数据集 1.数据集下载 TPC-H数据集: https://github.com/gregrahn/tpch-kit 可采用gcc下载或者直接下载zip包,然后解压即可. 具体使用方 ...
- NC20573 [SDOI2011]染色
题目链接 题目 题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如 ...
- Java设计模式-解释器模式Interpreter
介绍 在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法 分析树,最终形成一颗抽象的语法分析树.这里的词法分析器和语法分析器都可以看做是解释器 解释器模式 ...