Golang 语言基础之四: map, range
Golang 语言基础系列:
- Golang 语言基础之一: type, variable, constant
- Golang 语言基础之二: for, ifelse, switch
- Golang 语言基础之三: array, slice
- Golang 语言基础之四: map, range
- Golang 语言基础之五: function
- Golang 语言基础之六: string, pointer
- Golang 语言基础之七: struct, method
- Golang 语言基础之八: interface
- Golang 语言基础之九: error, panic, recover
- Golang 语言基础之十: goroutine, channel
Map
map
是 Golang 中的一种 Associative data type。提供类似于其他语言中 hash
或者 dictionary
的功能。map
类型是 Golang 语言中 3 个引用类型(slice, map, channel)之一。map
对象中的 Keys
元素必须不重复而且属于同一类型,该类型必须支持 ==
操作符,可以用于比较;Values
元素也必须属于同一类型,该类型可以是任意类型。
map
对象的声明形式为 map[TypeOfKey]TypeOfValue
。
还是从例子入手:
将上面的代码存入源文件 map.go 并使用 go run map.go
可以看到下面的输入:
注意,官方文档 中对使用内置函数 make
创建 map
对象时这样说:
从中可以看到,我们可以在创建 map
对象时设定预期的元素个数,这样在 map
对象中的键值对增加时避免频繁动态分配内存,提高效率。
Range
官网 For statement 对 range 表达式的返回值做了如下说明:
- 如果
a
是一个数组、数组的指针或者切片(slice),产生的索引以递增的顺序创建,如果索引是 for
语句的参数,则其从 0 开始到 len(a) - 1
。对于空 slice
来说,索引总数为零。
- 对于
string
类型的 a
,range
从该字符串中首个字符开始,每次增加一个 Unicode code points。在连续的迭代过程中,index
的索引为字符串经过 UTF-8 编码后连续的 code points 的首个字节索引,rune
类型的 range
返回的第二个值就是当前 UTF-8 code point的值。如果迭代过程遇到非法的 UTF-8 编码,则 range
返回的第二个值规定为 0xFFFD
,一个 Unicode 替代字符,然后迭代器向前前进一个字节。
map
中的索引顺序没有定义(not specified),Golang 不保证使用不同的索引后结果的顺序相同。如果 map
中的 pair 还未被访问时被删除了,该 pair 对应的 iteration 就不会生成。如果在迭代过程中创建新的键值对,可以选择是否在哪个具体的迭代过程中来创建。如果 map
对象是空的,则索引总数为零。
- 对于
channel
对象来说,range
产生的索引的值来自这个发送到该 channel
对象的连续的值,直到该对象被关闭(closed)。如果对象为 nil
,range
表达式会被一直 block。
参考资料
-- EOF --
有疑问加站长微信联系(非本文作者)