切片的长度与容量

程序员成长之旅 · 程序员成长之旅/Go语言学习/笔记 · 628 字

切片的长度与容量

切片拥有 长度 和 容量 。

切片的长度就是它所包含的元素个数。

切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。

切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。

你可以通过重新切片来扩展一个切片,给它提供足够的容量。试着修改示例程序中的切片操作,向外扩展它的容量,看看会发生什么。 package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} printSlice(s) // 截取切片使其长度为 0 s = s[:0] printSlice(s) // 拓展其长度 s = s[:4] printSlice(s) // 舍弃前两个值 s = s[2:] //关于为什么这样操作可以舍弃前两个值,因为切片可以说实际上就是指针,指针如果向后移动后想要看到原先的值是需要向后移动的,而切片是不支持向后移动的,所以这里取[2:]实际上就是舍弃了 0,1 两个位置的值 printSlice(s) } func printSlice(s []int) { fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) } //结果 len=6 cap=6 [2 3 5 7 11 13] len=0 cap=6 [] len=4 cap=6 [2 3 5 7] len=2 cap=4 [5 7] //注意看,这里的cap值发生了变化,这是不可逆的,这里相当于引用了一个新的切片 len=2 cap=4 [5 7]

25

1 package

main 2 3 import

"fmt" 4 5 func

main () { 6

s :

[] int { 2 , 3 , 5 , 7 , 11 , 13 } 7

printSlice ( s ) 8 9

// 截取切片使其长度为 0 10

s

=

s [: 0 ] 11

printSlice ( s ) 12 13

// 拓展其长度 14

s

=

s [: 4 ] 15

printSlice ( s ) 16 17

// 舍弃前两个值 18

s

=

s [ 2 :] //关于为什么这样操作可以舍弃前两个值,因为切片可以说实际上就是指针,指针如果向后移动后想要看到原先的值是需要向后移动的,而切片是不支持向后移动的,所以这里取[2:]实际上就是舍弃了 0,1 两个位置的值 19

printSlice ( s ) 20 } 21 22 func

printSlice ( s [] int ) { 23

fmt . Printf ( "len=%d cap=%d %v\n" , len ( s ), cap ( s ), s ) 24 } 25 26 //结果 27 len

6

cap

6 [ 2

3

5

7

11

13 ] 28 len

0

cap

6 [] 29 len

4

cap

6 [ 2

3

5

7 ] 30 len

2

cap

4 [ 5

7 ] //注意看,这里的cap值发生了变化,这是不可逆的,这里相当于引用了一个新的切片 31 len

2

cap

4 [ 5

7 ]