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对象,丢入队列 ...
随机推荐
- flask之一些凌乱知识点
本篇导航: session组件 上下文与内置函数 pymysql问题 模版问题 一.session组件 1.session组件简介 flask-session是flask框架的session组件,由于 ...
- __http原理__HTTP 协议简介
HTTP 协议通信流程 超文本 除了文本以外,还有其他数据类型的内容 HTTP 协议 指计算机网络通信中 两台计算机之间所必须遵守的规定或规则 Hypertext Transport Protocol ...
- Solve fatal error: helper_math.h: No such file or directory
When the 'fatal error: helper_math.h: No such file or directory' occurs, it means the 'helper_math.h ...
- Educational Codeforces Round 6
620A - Professor GukiZ's Robot 20171122 \(ans=max(\left | x2-x1 \right |,\left | y2-y1 \right |)\ ...
- AUC计算 - 进阶操作
首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前 ...
- css3的动画
一.CSS3变形 CSS3变形是一些效果的集合 如平移.旋转.缩放.倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移.旋转.缩放.倾斜等变化 二.CSS3位移:tr ...
- F#周报2019年第15期
新闻 Hedgehog新站点 Bolero 0.4发布,增加远程认证 FsToolkit.ErrorHandling与Cvdm.ErrorHandling合并了 F#里的3D图形编程与游戏开发 有趣的 ...
- 使用Eureka作为springcloud的注册机
使用springcloud做项目的负载均衡,需要导的jar这里不再显示,具体配置如下: 作为被注册服务配置: 启动多台服务端就可以实现集群,相应的localhost需要转成真实的ip 当然一个项目还要 ...
- 技术Leader相关文章和思考
参考文章: 你与优秀的技术Leader之间只差这一个“图谱” 如何成为优秀的技术主管?你要做到这三点
- Python全栈-JavaScript】jQuery工具
jQuery工具 一.jQuery.browser.version 显示当前 IE 浏览器版本号. if ( $.browser.msie ) alert( $.browser.version ); ...