8.4. Slices(切片)

切片(slice)底层对应类结构体,主要包含以下信息:指向数据的指针,有效数据的数目,和总 的内存空间大小。 切片支持用语法获取底层数组的某个元素。内建的len 方法可以获取切片的长度。内建的cap返回切片的最大容量。

对于一个数组或另一个切片,我们用aI:J?语句再它基础上创建一个新的切片。 这个新创建的切片底层 引用a(数组或之前的另一个切片),从数组的I位置 开始,到数组的J位置结束。新切片的长度是J - I。 新切片的 容量是数组的容量减去切片在数组中的开始位置I。我们还可以将数组的地址直接赋给 切片:s = &a, 这默认是对应整个数组,和这个语句等价:s = a0:len(a)?。

因此,我们在在C++中使用指针的地方用切片来代替。例如,创建一个100?byte类型的 值(100个字节的数组, 或许是做为缓冲用)。但是,在将数组传递给函数的时候不想复制整个数组(go语言 中数组是值,函数参数 传值是复制的),可以将函数参数定一个为byte切片类型, 从而实现只传递数组地址的目的。不过我们 并不需要像C++中那样传递缓存的长度——在Go中它们已经包含 在切片信息中了。

切片还可以应用于字符串。当需要将某个字符串的字串作为你新字符产返回的时候可以用切片代替。 因为go中的字符串是不可修改的,因此使用字符串切片并不需要分配新的内存空间。