Go Slice 的使用
原文: Slices/arrays explained: create, index, slice, iterate
概述
slice 是 Go 中的一种数据结构,描述了底层实现 array 的部分信息,并不会真实地存储任何数据。
- 修改 slice 中的元素,实际上就是修改底层实现 array 中的元素,引用相同 array 的 slice 也会相应被修改;
- slice 会进行扩容和缩容;
在第 5 次 append 后,slice 进行了扩容(以 2 为倍数)。
不同于 C 中的 realloc 方法,Go 中的 slice 没有直接的缩容方法,参考【1】中的给出了间接的方法示例。
- slice 的元素访问;
定义
- slice 的零值为 nil,内置方法 len、cap 和 append 都会把 nil 视为一个容量为 0 的 slice;
- 内置方法 len 和 cap 分别可以得到 slice 的长度和容量;
切片
支持从一个 slice 创建出新的 slice:
- 通过指定索引值区间 s[low:high] 创建一个 slice;
| |
从上述示例中,可以得出:
- 通过 s[low:high] 创建的 slice 的内存地址与 s 的内存地址不同;
- high 的最大值为 slice 的容量,若容量大于长度时l,high 的值可能会大于长度,此时通过切片会得到一个以元素零值填充的 slice;
- slice 中的元素为引用类型时,通过切片得到的新的 slice 中的元素保持相同的引用;
| |
迭代
- range 表达式用于迭代 slice;
- 两个迭代值 i 和 v 分别为索引值和元素值;
- 第 2 个迭代值是可选的;
- 如果 slice 为 nil,则其可迭代值为 0;
| |
上述示例可知,若一个 slice 为 nil 时,仍然可以作为 range 表达式的操作值。
添加和复制
- append 函数可以将一个元素添加到 slice 的尾部,如果超过了 slice 的容量会进行自动扩容;
- copy 函数可以将源 slice 中的元素复制到目标 slice 中,可复制的元素个数为源 slice 和目标 slice 长度中较小值;