【Go学习】slice切片的本质及操作——切片的追加、删除、插入等
切片的本质
一个切片是一个数组切割区间的描述。它包含了指向数组的指针,切割区间的长度,和容量(切割区间的最大长度),如下图所示:
假如使用 make([]byte, 5) 创建的切片变量s的结构如下图所示:
长度是切片引用的元素数目。容量是底层数组的元素数目(从切片指针开始)。关于长度和容量和区域将在下一个例子说明。
下面这个例子,我们继续对 s 进行切分,观察切片的数据结构和它引用的底层数组:
s = s[2:4]
注意上图中,这个时候切片的长度是2,但是切片的容量是3,容量是底层数组的元素数目(从切片指针开始),从上图指针出开始向右数,确实是3,注意长度和容量的区别。
切片并不复制整个切片元素。它创建一个新的切片执行同样的底层数组。这使得切片操作和数组索引一样高效。因此,通过一个新切片修改元素同样会影响到原始的切片。
d := []byte{
'r', 'o', 'a', 'd'}
e := d[2:]
// e == []byte{
'a', 'd'}
e[1] = 'm'
// e == []byte{
'a', 'm'}
// d == []byte{
'r', 'o', 'a', 'm'}
前面创建的切片 s 长度小于它的容量。我们可以增长切片的长度为它的容量:
s = s[:cap(s)]
上图中,切片长度和切片容量是一样的,都是3。
切片增长不能超出其容量。增长超出切片容量将会导致运行时异常,就像切片或数组的索引超出范围引起异常一样。同样,不能使用小于零的索引去访问切片之前的元素。
对切片有了一个整体的认识之后,下来我们结合一些实例来进行操作。
一、一般操作
1,声明变量,go自动初始化为nil,长度:0,地址:0,nil
package main
import (
"fmt"
)
func main(){
var ss []string;
fmt.Printf("length:%v \taddr:%p \tisnil:%v",len(ss),ss, ss==nil)
}