golang 基础(fourteen)slice

golang 基础(fourteen)slice_第1张图片
square-gopher.png

(slice)切片


golang 基础(fourteen)slice_第2张图片
slice.png

slice 是动态地表述数组的片段
每一个 slice 都包含一个指向数组的片段的指针 ptr,一个 len 用于表示数组片段的长度以及 cap 表示片段可扩展能力。

golang 基础(fourteen)slice_第3张图片
slice_illustration.JPG

  • s := []int{3,4,5} 有初始化值的初始化
  • s := []int{} 没有初始值的初始化,分配内存
  • s := []int 声明一个 slice ,且暂不分配内存
    这样声明好处当一个slice在随后可能不被使用,所以暂时不分配内存给他。
  • s := make([]int,5,10) 没有初始值的 slice 初始化,分配内存指定 slice 长度并且指定数组的承载能力
func main(){
    arr := [...]int{0,1,2,3,4,5,6,7}
    s := arr[2:6] //[2 3 4 5]
    fmt.Println(s)
}

s 就可以理解为数组 arr 的切片,在计算机中通常截取是半开半闭原则所以 2 是被包含进去而 6 不被包含。

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

结果自己尝试吧

slice 的长度和可扩展

s := arr[2:6]
    fmt.Println(cap(s)) //6
    fmt.Println(len(s)) //4

长度就不解释,扩展是就是 arr 在 slice 后面还剩几个元素就是 slice 几位可扩展。

还可以对 slice 进行取 slice

s = s[:3]
    fmt.Println(s) //[2 3 4]
    s = s[2:]//[4]
    fmt.Println(s)

那么可以进一步研究一下下面的代码,看一看扩展的用途,这里注意一下 s1 从 s 中进行取值,取值范围已经超出的 s 的长度,但是因为没有超出其扩展,所以 s1 会从数组 arr 进行取值。

s := arr[2:6]
    fmt.Println(cap(s)) //6
    fmt.Println(len(s)) //4

    s1 := s[3:5]
    fmt.Println("s = ",s)
    fmt.Println("s1 = ",s1)
s =  [2 3 4 5]
s1 =  [5 6]
golang 基础(fourteen)slice_第4张图片
slice_extension.JPG
golang 基础(fourteen)slice_第5张图片
slice_extension_02.JPG
  • s 的值为[2,3,4,5], s2 的值为[5,6]
  • slice 可以向后扩展,不可以向前扩展
  • s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

你可能感兴趣的:(golang 基础(fourteen)slice)