先看一段代码:

func main() {
m := make(map[int]string) m[1] = "a"
m[2] = "b"
m[3] = "c" for k, v := range m {
fmt.Println(k, v)
} fmt.Println("-----------------") mm := make(map[int]string) mm[1] = "a"
mm[2] = "b"
mm[3] = "c" for k, v := range mm {
fmt.Println(k, v)
} fmt.Println("-----------------") mmm := make(map[int]string) mmm[1] = "a"
mmm[2] = "b"
mmm[3] = "c" for k, v := range mmm {
fmt.Println(k, v)
}
}

 我起初以为三次的输出中,元素的输出顺序都是相同的,可惜,得到的结果如下:

[cobbliu@xxx map]$ go run range.go
1 a
2 b
3 c
-----------------
1 a
2 b
3 c
-----------------
3 c
1 a
2 b

 

对,Go中map的一个很重要的特性就是:当您多次通过range循环来迭代访问map中元素时,尽管您访问的是同一个map,但是访问元素的顺序在前后两次range中是不会完全相同的。当然也不是完全随机的。从Go1开始,Go在range遍历Map中元素的时候,从随机的一个位置开始迭代

为什么要这样做?因为Go的设计者们认为会有一些程序员对同一个map中元素的遍历顺序假设为相同,在这个假设的前提下,会做一些事情(今天的我就是这样,在这个假设的前提下,码了很多字母),他们认为不应该对一个map中的元素的遍历顺序有假设,所以从Go1.0开始,随机化了range map的起始位置。

尽管掉坑里了,但是却使我对Go又多了一层好感,Go设计者在每个细节上都深思熟虑,他们尽量保持了语言的严谨性,创造了完整的辅助工具,对于一些模棱两可的特性,强加了约束,只有这样,才会防止在应用层代码出现诡异的bug,让Go语言使用者们能放心使用它。

尽管现在的Go少了泛型,但是这个特性真的有那么必要么?Go说,至少目前,没有那么必要!

Go map中一个很重要的特性的更多相关文章

  1. 在map中一个key中存多个值

    一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List> ...

  2. Firefox中一个很好用的host工具--HostAdmin

    支持分组的功能超级好用 host中如下添加 [#] 17 [# COMMENT]#==== 17#192.168.0.17 www.xxx.com#192.168.0.17 1.xxx.com#192 ...

  3. JAVA中map的分类和各自的特性

    java为数据结构中的映射定义了一个接口java.util.Map,他实现了四个类,分别是:HashMap,HashTable,LinkedHashMapTreeMap Map不允许键重复,但允许值重 ...

  4. 有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)

    引用 前几天在网上看到一个淘宝的面试题:有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果.一:分析题目 从题中可以看到“很大的List”以及“ ...

  5. 获取map中的一个value值以及遍历map获得map里所有key、value的值

    前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...

  6. STL中map的一个知识点

    问题背景 在做USACO Section 1.1 Greedy Gift Givers的时候,我最初的想法是直接用一个map来进行数据处理.但是后来产生一个让我感到疑问的地方,后来我经过测试,发现了这 ...

  7. 求一个Map中最大的value值,同时列出键,值

    求一个Map中最大的value值,同时列出键,值 方法1. public static void main(String[] args){  Map map=new HashMap();  map.p ...

  8. 信1705-2 软工作业最大重复词查询思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中。 (2)定义一个Map,key是字符串类型,保存单词;value是数字类型,保存该单词出现的次数。 (3)遍历(1)中得到的字符串数组,对于每一个单词,考察Map的key中是否出现过该单词,如果没出现过,map中增加一个元素,key为该单词,value为1(

    通过学习学会了文本的访问,了解一点哈希表用途.经过网上查找做成了下面查询文章重复词的JAVA程序. 1 思 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词 ...

  9. MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得。

    MVC已经是现代Web开发中的一个很重要的部分,下面介绍一下Spring MVC的一些使用心得. 之前的项目比较简单,多是用JSP .Servlet + JDBC 直接搞定,在项目中尝试用 Strut ...

随机推荐

  1. MFC中打印对话框CPrintDialog类

    void CCPrintDialogView::OnPrint() { DWORD dwflags=PD_ALLPAGES|PD_NOPAGENUMS|PD_USEDEVMODECOPIES|PD_S ...

  2. 用Python开始机器学习(2:决策树分类算法)

    http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树 ...

  3. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  4. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十七):kafka manager安装

    一.kafka-manager简介 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 Kafka Manager.这个管理工具可以很容 ...

  5. 【Python】torrentParser1.02

    #------------------------------------------------------------------------------------ # torrentParse ...

  6. PowerDesigner设计的数据库 ORA-0092

    异常 数据库由Powerdesigner设计,格式为Oracle10g,由Powerdesigner生成的数据库并没报什么异常,使用navicat也能正常操作,而使用PLSQL Developer去出 ...

  7. IO multiplexing 与 非阻塞网络编程

    使用I/O multipexing 的网络编程中,一般需要采用非阻塞网络编程的风格,防止服务端在处理高连接量大时候阻塞在某个文件描述符上面,比如某个socket 有大量的数据需要写,但是内核发送缓冲区 ...

  8. jquery.cookie.js结合asp.net实现最近浏览记录

    一.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  9. MVC 之 解决MVC中使用BundleConfig.RegisterBundles引用Css及js文件发布后的丢失

    在MVC3中我们这样引用资源文件: <link href="@Url.Content("~/Content/Site.css")" rel="s ...

  10. Mahout 协同过滤 itemBase RecommenderJob源码分析

    来自:http://blog.csdn.net/heyutao007/article/details/8612906 Mahout支持2种 M/R 的jobs实现itemBase的协同过滤 I.Ite ...