golang 基础(fourteen)slice
2019-03-18 本文已影响45人
zidea
square-gopher.png
slice.png
(slice)切片
slice.png
slice 是动态地表述数组的片段
每一个 slice 都包含一个指向数组的片段的指针 ptr,一个 len 用于表示数组片段的长度以及 cap 表示片段可扩展能力。
- 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]
slice_extension.JPG
slice_extension_02.JPG
- s 的值为[2,3,4,5], s2 的值为[5,6]
- slice 可以向后扩展,不可以向前扩展
- s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)