切片是一个引用类型

    1.字面量方式声明切片

    1. slice := []int{1,2,3,4,5}//长度和容量为5

    2.使用make()函数

    1. slice := make([]int,0) //长度和容量为0
    2. newSlice := make([]int,0,5) //长度为0,容量为5

    使用make函数创建切片时,长度代表切片的长度,容量指向底层一个长度为5的数组

    计算切片长度和容量:
    slice := []int{10, 20, 30, 40, 50}
    newSlice := slice[1:3]
    长度: j - i
    容量: k - i
    对于newSlice来说,他的长度和容量如下:
    长度:3 - 1 = 2
    容量: 5 - 1 = 4

    上面的示例中,3代表原数组索引3的位置,5代表原数组的长度。虽然newSlice的长度为4,但是他仍然无法访问后两位索引值 (除了再次对它进行切片处理)。newSlice即使被slice分配切片,但是它们俩的底层数组是进行共享的。当newSlice被改变时,slice也会被改变。

    接着上面所说,newSlice被分配后结果为:[20,30],虽然此时容量为4,但是无法访问40和50这两个值,所以要对切片重新进行切片:
    newSlice = newSlice[:cap(newSlice)] ,这相当于newSlice[:4],也就是获取0~容量值结束.[20,30,40,50]

    如果我想删除掉最后一个值:
    newSlice = newSlice[:len(newSlice)-1] ,相当于[:4-1=3] === [20,30,40] len-1等于是长度4-1等于3,因为获取的总是start ~ end-1的值.len-1还原了索引值,因为长度是从1开始计算。如果一个切片长度为5,那么想获取最后一位就是len-1也就是5-1=4 .index是从0,1,2,3,4刚好是长度为5

    3.另一种声明方式

    1. source := []string{"Apple", "Orange", "Plum", "Banana", "Grape"}
    2. slice := source[2:3:4] //长度为1,容量为2

    这种方式可以利用上面的公式:
    对于slice [i:j,k][2:3:4]
    长度:j - 1 或 3 - 2 = 1
    容量:k - i 或 4 - 2 = 2
    所以slice = [“Plum”]
    如果试图设置的容量比可用的容量还大,就会得到一个语言运行时错误 :[2:3:6]是不允许的