Go map使用
前言
map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。
在一个map里所有的键都是唯一的,而且必须是支持==和!=操作符的类型,切片、函数以及包含切片的结构类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误。
	map的value值可以是任意类型,没有限制。map里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不相同。
	注意:map是无序的,我们无法决定它的返回顺序,所以,每次打印结果的顺序有可能不同。
创建与初始化
package main
import "fmt"
func main() {
	//初始化
	//1.定义同时初始化
	var m1 map[int]string  =map[int]string{1:"linlin",2:"sanye"}
	fmt.Println(m1)
	//2.自动推导类型
	m2 := map[int]string{1:"linlin",2:"sanye"}
	fmt.Println(m2)
	//3.使用make创建
	m3 :=make(map[int]string)
	fmt.Println(m3)
	//创建固定长度的map
	m4 := make(map[int]string,10)
	fmt.Println(m4)
}
访问与赋值
package main
import "fmt"
func main() {
	//初始化
	m2 := map[int]string{1:"linlin",2:"sanye"}
	fmt.Println(m2) //map[1:linlin 2:sanye]
	m2[1] = "sanye"
	m2[2] = "linlin"
	fmt.Println(m2) //map[1:sanye 2:linlin]
	fmt.Println(m2[1],m2[2])//sanye linlin
}
遍历
Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的。每一次遍历都不相同。
这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。
当使用 for range 遍历 map 时,不保证每次执行程序获取的元素顺序相同!!!
package main
import "fmt"
func main() {
	m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
	for k,v := range m3{
		fmt.Println("key:%d value:%s",k,v)
	}
	//判断map中key是否存在
	if v,has :=m3[1];has{ //map[下标]
		fmt.Println("value=",v,"has=",has)
	} else{
		fmt.Println("value=",v,"has=",has)
	}
}
删除
使用delete()函数,指定key值可以方便的删除map中的k-v映射。
package main
import "fmt"
func mapDelete(m map[int]string,key int) map[int]string{
	delete(m,key)
	return m
}
func main() {
	m3 := map[int]string{0:"linlin",1:"sanye",2:"timi",3:"meyi"}
	fmt.Println(m3)//map[0:linlin 1:sanye 2:timi 3:meyi]
	delete(m3,1) //删除key值为2的map
	fmt.Println(m3)//map[0:linlin 2:timi 3:meyi]
	mapDelete(m3,0)
	fmt.Println(m3)//map[2:timi 3:meyi]
}
map为引用类型
map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。
package main
import (
"fmt")
func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("Original person salary", personSalary)
newPersonSalary := personSalary
newPersonSalary["mike"] = 18000
fmt.Println("Person salary changed", personSalary)
}
上面程序中的第 14 行,personSalary 被赋值给 newPersonSalary。下一行 ,newPersonSalary 中 mike 的薪资变成了 18000 。personSalary 中 Mike 的薪资也会变成 18000。程序输出:
Original person salary map[steve:12000 jamie:15000 mike:9000]
Person salary changed map[steve:12000 jamie:15000 mike:18000]当 map 作为函数参数传递时也会发生同样的情况。函数中对 map 的任何修改,对于外部的调用都是可见的。
map的相等性与长度
map相等性:
map 之间不能使用 == 操作符判断,== 只能用来检查 map 是否为 nil。
判断两个 map 是否相等的方法是遍历比较两个 map 中的每个元素。
map长度:
package main
import (
"fmt")
func main() {
personSalary := map[string]int{
"steve": 12000,
"jamie": 15000,
}
personSalary["mike"] = 9000
fmt.Println("length is", len(personSalary)) //结果为3
}
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对象,丢入队列 ... 
随机推荐
- Greenwich.SR2版本的Spring Cloud Feign实例
			前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ... 
- Cisco Port-Channel 设置(链路聚合--重点)
			Port-Channel 的在实际工作中的主要作用是将两个或多个端口捆绑成为一个虚拟通道. interface Port-channel1 description port(1/0/5-6) swit ... 
- [Paper翻译]Scalable Lock-Free Dynamic Memory Allocation
			原文: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.3870&rep=rep1&type=pdf Abstr ... 
- (一)深入java虚拟机之内存溢出与分析
			一.内存溢出程序 public class Test { public static void main(String[] args) { List<User> userList=new ... 
- Node.js在跑Express的时候有个时候会卡住按一下Ctrl+C又好了的解决办法
			Node.js编写了一个基于Express的Web应用,但是有的时候这个应用会卡死. 后来发现原因是我使用了Windows原生的命令行,会出现这个问题. 也就是说我是在文件夹下面Shift+鼠标右键, ... 
- JQ操作select项
			jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Se ... 
- linux下的进程间通信概述
			管道(PIPE) FIFO(有名管道) XSI消息队列 XSI信号量 XSI共享内存 POSIX信号量 域套接字(Domain Socket) 信号(Signal) 互斥量(Mutex) 其中信号(s ... 
- 最新 美团java校招面经 (含整理过的面试题大全)
			从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.美团等10家互联网公司的校招Offer,因为某些自身原因最终选择了美团.6.7月主要是做系统复习.项目复盘.LeetCode ... 
- IIC挂死问题解决过程
			0.环境:arm CPU 带有IIC控制器作为slave端,带有调试串口. 1.bug表现:IIC slave 在系统启动后概率挂死,导致master无法detect到slave. 猜测1:认为IIC ... 
- K8S从入门到放弃系列-(3)部署etcd集群
			摘要:etcd 是k8s集群最重要的组件,用来存储k8s的所有服务信息, etcd 挂了,集群就挂了,我们这里把etcd部署在master三台节点上做高可用,etcd集群采用raft算法选举Leade ... 
