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. 重构file_get_contents实现一个带超时链接访问的函数

    function wp_file_get_contents($url, $timeout = 30) { $context = stream_context_create(array( 'http' ...

  2. [Codeforces Round #438][Codeforces 868D. Huge Strings]

    题目链接:868D - Huge Strings 题目大意:有\(n\)个字符串,\(m\)次操作,每次操作把两个字符串拼在一起,并询问这个新串的价值.定义一个新串的价值\(k\)为:最大的\(k\) ...

  3. cmd 命令 net start mongodb 启动不了,提示 net 不是内部命令或者外部命令

    1.要管理员的身份进入 cmd 2.右击我的电脑-->属性-->高级系统设置 3.选择高级-->环境变量 4.找到系统变量-->Path-->编辑 5.把 C:\wind ...

  4. 解析数学表达式 代码解析AST语法树

    2019年2月20日09:18:22 AST语法树自己写代码解析的话就比较麻烦,有现成的库可以解析PHP,就像webpack就是自己解析js的语法代码,编译成各种版本的可用代码 github http ...

  5. workerman 安装event 扩展

    2018年7月31日10:07:47 一些小技巧 命令行直接运行PHP代码 php -r "phpinfo();" 交互模式运行PHP php -a PHP脚本作为shell脚本运 ...

  6. vue学习目录 vue初识 this指向问题 vue组件传值 过滤器 钩子函数 路由 全家桶 脚手架 vuecli element-ui axios bus

    vue学习目录 vue学习目录 Vue学习一之vue初识 Vue学习二之vue结合项目简单使用.this指向问题 Vue学习三之vue组件 Vue学习四之过滤器.钩子函数.路由.全家桶等 Vue学习之 ...

  7. 使用docker搭建centos虚拟机

    网上有很多安装linux的,这里不记录; windows安装docker 转自:https://www.cnblogs.com/samwu/p/10360943.html(windows是家庭版的) ...

  8. JAVA RPC (五) 之thrift序列化RPC消息体

    让大家久等了.继续更新thrift序列化的消息体,下面我们一步一步的看一看thrift的rpc是怎么实例化消息体的. 首先我们先准备一个request文件 namespace java bky str ...

  9. openLayers,常见地图实例

    http://openlayers.org/en/master/examples/epsg-4326.html -- 标尺 http://openlayers.org/en/master/exampl ...

  10. 用node在本机搭建一个极其简单的服务器

    首先安装node, 建一个文件夹server, 在里面创建一个server.js,内容如下: var http = require("http"); http.createServ ...