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. Django中Q搜索的简单应用

    本节涉及: 1.Q搜索在前后端的设计 2.Django中Queryset对象的序列化(由后端扔给前端的数据必然会经过序列化) 3.前端动态地构造表格以便显示(动态创建DOM对象) 思路: 用户通过前端 ...

  2. java实现文章敏感词过滤检测

    SensitivewordFilter.java import java.util.HashSet; import java.util.Iterator; import java.util.Map; ...

  3. 移动端web开发常见问题

    1.移动端如何定义字体font-family 三大手机系统的字体: ios 系统 默认中文字体是Heiti SC 默认英文字体是Helvetica 默认数字字体是HelveticaNeue 无微软雅黑 ...

  4. Android自定义控件之日历控件

      标签: android 控件 日历 应用 需求 2015年09月26日 22:21:54 25062人阅读 评论(109) 收藏 举报 分类: Android自定义控件系列(7) 版权声明:转载注 ...

  5. 织梦手机站下一篇变上一篇而且还出错Request Error!

    最新的织梦dedecms程序手机版下一篇变上一篇而且还出错Request Error!,这是因为官方写错了一个地方 打开 /include/arc.archives.class.php 找到 $mli ...

  6. 小甲鱼零基础python课后题 P22 021函数:lambda表达式

    0.请使用lambda表达式将下边函数转变为匿名函数 def fun_A(x,y=3): return x*y 答: lambda x,y=3:x*y 1.请将下边的匿名函数转变为普通的屌丝函数 la ...

  7. iOS8之后搜索框的常规实例

    1.在一个二级导航控制器中添加一个UITableviewController作为子控制器 2.UITableviewController.tableView 作为展示结果 3.利用iOS之后的UISe ...

  8. docker上配置mysql主从复制

    1.在docker上启动2台mysql容器:(这里3306为主,3307为从) docker run -d  -e MYSQL_ROOT_PASSWORD=123456  -p 3306:3306 - ...

  9. YOLO V3 错误总结

    问题1 TypeError: function takes exactly 1 argument (3 given) 报错说PIL库中的函数只接收到一个参数,应该给三个,自己在这里记录下解决方法,出错 ...

  10. 创建一个vue项目()

    1.打开cmd,选定路径 2. vue init webpack "项目名称“ 3.在项目路径下,安装一下项目依赖 cnpm install 4.运行   cnpm run dev 5.在浏 ...