示例一

 // 一、定义一个含有0-7的数组
arr := [...]int{0,1,2,3,4,5,6,7}   

 //二、取出arr数组位置2-6的切片(计数从0开始)
s := arr[2:6]  

 //三、取出arr数组位置为6之前的切片(计数从0开始)
a := arr[:6]

 //四、取出arr数组位置为2之后的切片(计数从0开始)
b := arr[2:]

 //五、取出arr数组所有的切片
c := arr[:]

s的值为 [2 3 4 5]
a的值为 [0 1 2 3 4 5]
b的值为 [2 3 4 5 6 7]
c的值为 [0 1 2 3 4 5 6 7]

示例二

// 不加长度的数组就是slice(切片)
func updateSlice(s []int){
    s[0] = 100
}

func main(){
    arr := [...]int{0,1,2,3,4,5,6,7}

    s1 := arr[2:]
    fmt.Println("s1 =", s1)
    s2 := arr[:]
    fmt.Println("s2 =", arr[:])

    //调用updateSlice
    updateSlice(s1)
    //输出s1
    fmt.println(s1)
    //输出arr本身
    fmt.println(arr)

    updateSlice(s2)
    //输出s2
    fmt.println(s2)
    //输出arr本身
    fmt.println(arr)

    // Reslice
    fmt.println(s2)
    s2 = s2[:5]
    fmt.println(s2)
    s2 = s2[2:]
    fmt.println(s2)
}

//输出结果
s1 = [2 3 4 5 6 7]
s2 = [0 1 2 3 4 5 6 7]
调用updateSlice之后
[100 3 4 5 6 7]   //(updateslice s1后的s1)
[0 1 100 3 4 5 6 7]   //(updateslice s1后的arr)
[100 1 100 3 4 5 6 7]  //(updateslice s2后的s2)
[100 1 100 3 4 5 6 7] //(updateslice s2后的arr)

//Reslice之后
[100 1 100 3 4 5 6 7] (原updateslice s2后的s2)
[100 1 100 3 4] (对s2进行Relice(再次切片))
[100 3 4] (对s2再次切片后的s2进行再次切片)

Slice的扩展

arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]

s1 为 [2 3 4 5]
s2 为 [5 6]


s2:=arr[3:5] 0 1 2 s2下标
s1:=arr[2:6] 0 1 2 3 [4 5] s1下标
arr 0 1 2 3 4 5 6 7 数组中数值


Slice的 len 和 cap

注:s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

Slice的实现如图所示

file

func main(){

    arr := [...]int{0,1,2,3,4,5,6,7}

    s1 := arr[2:6]
    fmt.Println("s1 = %v, len(s1) = %d, cap(s1)=%d\n", s1, len(s1), cap(s1))
    s2 := s1[3:5]
    fmt.Println("s2 = %v, len(s2) = %d, cap(s2)=%d\n", s2, len(s2), cap(s2))
}

//输出
s1 = [2 3 4 5] , len(s1)=4 , cap(s1)  //len为切片长度cap为底层数组范围
s2 = [5 6], len(s2)=2, cap(s2)=3 //len为切片长度cap为底层数组范围