数组、切片与映射
数组:固定长度
数组长度在声明时确定且不可变,实际工程中直接使用数组的场景较少:
数组是值类型,赋值与传参都会完整拷贝。正因如此,Go 中通常使用切片代替数组。
切片:可动态增长的序列
切片是对底层数组一段连续内存的引用视图,由三个字段构成:指针(指向底层数组)、长度 len、容量 cap。
切片的常见操作
Warning
切片共享底层数组。sub := s[1:3] 得到的切片修改元素会影响 s;append 在容量足够时也会写入原数组。若需要独立副本,使用 copy 或 Go 1.21+ 的 slices.Clone。
映射:键值对集合
遍历与有序性
映射的遍历顺序是随机的,这是语言层面的刻意设计。若需要稳定顺序,须对键排序后遍历:
Warning
映射元素不可寻址(无法对 m["k"] 取地址)。映射本身不是并发安全的,并发读写需要加锁或使用 sync.Map,详见并发编程章节。
range 遍历
range 支持切片、数组、映射、字符串与通道:
slices 与 maps 工具包(Go 1.21+)
标准库新增了泛型工具包,覆盖常用的查找、排序、去重等操作:
小结
- 切片是工程实践中的首选序列类型,注意共享底层数组带来的副作用。
- 映射遍历无序,"comma ok" 惯用法用于判断键是否存在。
- Go 1.21+ 优先使用
slices、maps包而非手写工具函数。