map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。

map定义

语法:map[KeyType]ValueType
KeyType:表示键的类型。
ValueType:表示键对应的值的类型
map类型的变量默认初始值为nil,需要使用make()函数来分配内存。
语法:make(map[KeyType]ValueType, [cap])
cap表示map的容量,该参数虽然不是必须的

var a1 map[string]int
fmt.Println(a1 == nil) //true
//初始化
a := make(map[string]int,3)
a["ares"] = 100
a["ares1"] = 1000
fmt.Println(a) //map[ares:100 ares1:1000]

map声明的时候初始化

b := map[int]int{
1:1,
2:2,
}
fmt.Println(b) //map[1:1 2:2]

判断某个键是否存在

语法:value, ok := map[key]

//判断某个值是否存在
c := map[string]int{
"北京":80,
"上海":70,
"成都":90,
}
// 如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值
v,ok := c["北京"]
if ok{
fmt.Println(v) //存在 80
}else{
fmt.Println("不存在")
}

map的遍历

使用for range遍历map。

//k,v遍历
for k,v :=range c{
fmt.Println(k,v)
}
输出:北京 80
上海 70
成都 90
//只遍历map中的key
for k := range c{
fmt.Println(k)
}
输出:上海
成都
北京
//只遍历map中的value
for _,v := range c{
fmt.Println(v)
}
输出:90
80
70

遍历map时输出的元素顺序与填充顺序无关,遍历是无序的!

按照指定顺序遍历map

var d = make(map[string]int,50)
//添加10个键值对
for i:=0;i<10;i++{
key := fmt.Sprintf("test%02d",i) //生成test开头的字符串
value := rand.Intn(100) //生成0-99的随机数
d[key] = value
//fmt.Println(key,value)
}
//按照key从大到小顺序遍历d
//取出map中的key存入切片
keys := make([]string,0,50)
for k := range d{
keys = append(keys,k)
}
//fmt.Println(keys)
//对切片排序
sort.Strings(keys)
//fmt.Println(keys)
//按照排序后的key遍历
for _,v :=range keys{
fmt.Println(v,d[v])
}
输出:
test00 81
test01 87
test02 47
test03 59
test04 81
test05 18
test06 25
test07 40
test08 56
test09 0
//按照value排序
values := make([]int,0,50)
for _,v := range d{
values = append(values,v)
}
sort.Ints(values)
//fmt.Println(values)
for _,v := range values{
//fmt.Println(v)
for k1,v1 :=range d{
if v == v1{
fmt.Println(k1,v1)
}
}
输出:
test09 0
test05 18
test06 25
test07 40
test02 47
test08 56
test03 59
test00 81
test04 81
test00 81
test04 81
test01 87
}

map的删除

delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key。实例如下:

func main() {
// 初始化map
citymap := map[string]string {
"bj":"bj",
"shandong":"jinan",
"sichuan":"chengdu",
"jiangsu":"nanjing",
}
fmt.Println("原始map")
for k,v := range citymap{
fmt.Printf("province is:%v,shenghui is %v\n",k,v)
}
//删除bj
delete(citymap,"bj")
fmt.Println("删除后map")
for k,v := range citymap{
fmt.Printf("province is:%v,shenghui is %v\n",k,v)
}
}
输出:
原始map
province is:shandong,shenghui is jinan
province is:sichuan,shenghui is chengdu
province is:jiangsu,shenghui is nanjing
province is:bj,shenghui is bj
删除后map
province is:sichuan,shenghui is chengdu
province is:jiangsu,shenghui is nanjing
province is:shandong,shenghui is jinan

元素为map类型的切片

//元素为map类型的切片
var map1 = make([]map[string]string,5) //切片的初始化
for k,v :=range map1{
fmt.Println(k,v)
}
//对切片中map元素进行初始化
map1[0] = make(map[string]string,3)
map1[0]["name"] = "ares"
map1[0]["sex"] = "man"
map1[0]["age"] = "22"
for k,v := range map1{
fmt.Println(k,v)
}
输出:
0 map[name:ares sex:man age:22]
1 map[]
2 map[]
3 map[]
4 map[]

值为切片类型的map

//值为切片的map
var map2 = make(map[string][]int,5) //只完成了map的初始化,因为值是个切片,所以初始化为[]int
v,ok := map2["ares"]
if ok{
fmt.Println(v)
}else{
//map2没有ares这个键
map2["ares"] = make([]int,5) //切片初始化
map2["ares"][0] = 1
map2["ares"][1] = 1
map2["ares"][2] = 1
}
for k,v :=range map2{
fmt.Println(k,v) //ares [1 1 1 0 0]
}

统计字符串中单词出现次数

//统计单词出现次数
var s = "what are you nong sha nong"
//定义一个map
var map3 = make(map[string]int,10)
//字符串中有哪些单词,返回一个切片
s1 := strings.Split(s," ")
//fmt.Println(s1)
//遍历单词做统计
for _,v1 :=range s1{
vv,ok := map3[v1]
if ok{
//map中有记录
map3[v1] = vv+1
}else{
map3[v1] = 1
}
}
for k,v := range map3{
fmt.Println(k,v)
}
输出:
what 1
nong 2
sha 1
are 1
you 1

GO map的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  10. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

随机推荐

  1. (56)Wangdao.com第八天_JavaScript 流程控制语句

    流程控制语句 条件判断语句 if 条件分支语句 switch 循环语句 for .while switch 和 if 都可以相互转换,switch 的性能更优于 if 1. 条件判断语句 if 在某条 ...

  2. 前端性能优化 —— reflow(回流)和repaint(重绘)

    简要:整个在浏览器的渲染过程中(页面初始化,用户行为改变界面样式,动画改变界面样式等)reflow(回流)和repaint(重绘) 会大大影响web性能,尤其是手机页面.因此我们在页面设计的时候要尽量 ...

  3. Gparted Live分区调整

    由于年少无知,在安装ubuntu系统的时候,以为/temp是软件包安装时解压的缓冲,所以给/temp留了10G,而以为/var只是记录一些log而已,因此把仅存的1G分配给了它.随后在安装软件时出现“ ...

  4. 菜鸟详细解析Cookie注入原理

    一.SQL注入原理 我以aspx为例,现在我们来研究下Cookie注入是怎么产生的,在获取URL参数的时候,如果在代码中写成Request[“id”],这样的写法问题就出现了.我先普及下科普知识,在a ...

  5. Java中“==”和“equals()”的区别

    “==”比较的是变量所指向的对象,当S1在内存中定义以后,再定义s2的时候s2所指向的值是定义s1时候所创建的,而不是又在内存创建了一个“Monday”. “equals”比较的是对象所指向的值,所以 ...

  6. JAVA访问控制修饰符

    1.public和private private修饰的成员变量和方法仅仅只能在本类中调用:  public修饰的成员变量和方法可以在任何地方调用. public修饰的内容是对外提供可以被调用的功能,需 ...

  7. Weex开发中的应用小笔记

    内容: 获取输入或其他操作使得值一直改变并在一段不改变的时间后执行下一步操作(输入搜索关键字并执行搜索) https://vuejs.org/v2/guide/computed.html?spm=a2 ...

  8. iOS代码组件化--利用cocoaPods创建私有库

    如果项目模块多,模块间逻辑复杂,我们发现多个人同时维护一个代码仓库需要十分小心,一不小心,造成冲突,解决起来很烦,相信很多人都遇到手工删除合并的冲突的文件的经历. 如果利用组件化思想,每个人维护自己的 ...

  9. 64IE无法显示网页

    1.碰到如下图情况ie浏览器打开之后显示不了网页,但是试了下电脑上其他的浏览器都可以正常的打开网页. 2.解决办法为:打开浏览器-选择“工具”-“Internet选项”-“高级”-重置,重启浏览器后能 ...

  10. 好的UI管理后台

    1,https://www.v2ex.com/t/513539 - https://github.com/a54552239/projectManage