Go map中一个很重要的特性
2015-05-11 22:19
204 查看
先看一段代码:
我起初以为三次的输出中,元素的输出顺序都是相同的,可惜,得到的结果如下:
对,Go中map的一个很重要的特性就是:当您多次通过range循环来迭代访问map中元素时,尽管您访问的是同一个map,但是访问元素的顺序在前后两次range中是不会完全相同的。当然也不是完全随机的。从Go1开始,Go在range遍历Map中元素的时候,从随机的一个位置开始迭代。
为什么要这样做?因为Go的设计者们认为会有一些程序员对同一个map中元素的遍历顺序假设为相同,在这个假设的前提下,会做一些事情(今天的我就是这样,在这个假设的前提下,码了很多字母),他们认为不应该对一个map中的元素的遍历顺序有假设,所以从Go1.0开始,随机化了range map的起始位置。
尽管掉坑里了,但是却使我对Go又多了一层好感,Go设计者在每个细节上都深思熟虑,他们尽量保持了语言的严谨性,创造了完整的辅助工具,对于一些模棱两可的特性,强加了约束,只有这样,才会防止在应用层代码出现诡异的bug,让Go语言使用者们能放心使用它。
尽管现在的Go少了泛型,但是这个特性真的有那么必要么?Go说,至少目前,没有那么必要!
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语言基础-for语句特性,字符串循环的一个小问题
- 相当当中 ,还用到一个很重要的类 ,map地图类
- [Golang]Map的一个绝妙特性
- go语言之map练习(二):编写一个程序wordfreq程序,统计输入文本中每个单词出现的频率(次数)
- [Golang]Map的一个绝妙特性
- [go语言]channel的一个“奇怪”特性
- 利用map的特性做一个简易的投票程序
- go语言特性113
- 如何将一个map结构的数据转换成JSON结构的数据
- Go语言中的 Array, Slice和 Map
- Hashtable 和 HashMap 做为 Map 的基本特性
- GO语言-数组特性
- Go 语言简介(下)— 特性
- GO 之MAP的使用
- SortedMap与TreeMap的一个典型应用
- GO语言学习笔记2(指针数组MAP)
- EXTJS学习系列基础篇:第四篇(转载)作者殷良胜,Ext中有两个很重要的方法,一个是decode;一个是encode.顾名思义,一个是编码,一个是解码,你难道真的这么想吗?严格的说,一个是将json字符串转换成对象;一个是将对象转换成json字符串
- 将一个php的一个查询代码改成go语言
- Go 1.9 新特性 Type Alias 详解
- Lambda——JDK8推出的一个新特性