GO map
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的更多相关文章
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- 多用多学之Java中的Set,List,Map
很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
随机推荐
- 在Linux下开发多语言软件(gettext解决方案)
最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言 ...
- Linux各目录及每个目录的详细介绍(转载)
[常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录,是用户主目录的基点 ...
- makefile编写
概述 什么是makefile?或许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序猿,makefil ...
- Android 基础知识
system/app 与 system/priv-app Android4.4系统在system目录下新增了priv-app目录,在该目录下的apk一般都是系统核心应用如Launcher.sy ...
- NTSC PAL 介绍
NTSC-J是日本地区的模拟 电视系统和视频显示标准,于2011年7月24日在全国47个县中的44个地区停止运营.模拟广播于2012年3月31日在2011年Tōhoku摧毁的三个县停止地震和海啸(岩手 ...
- 新装的centos怎样显示中文界面
默认的显示英文界面,即使各种配置中都选择的chinese也没用,默认显示的还是英文. 要在终端输入 vim ~/.bashrc 编辑本用户配置文件 打开后最后一行加入 export LANG=&quo ...
- debug_backtrace
<?php one(); function one() { two(); } function two() { three(); } function three() { print_r( de ...
- 学习ActiveMQ(一):安装与启动
一:简单介绍 AvtiveMQ是Apaceh所研发的一个开源消息中间件,用来在服务与服务之间进行异步通信,是基于JMS规范的.activemq包含发送者(sender).消息(message).队列( ...
- 查看历史会话等待事件对应的session信息
此处以enq: TX - row lock contention等待时间为例. 查看snap_id对应时间 select to_char(s.startup_time,'dd Mon "at ...
- python之元组
一.元组定义 元组(tuple)使用小括号()来定义,它是不可变数据类型,它的元素不可变,但元素的元素是可变的,比如tuple中一个元素为list列表时,list中的元素是可变的 # 在定义tuple ...