golang 切片长度 容量

发布时间:2024-12-22 23:31:43

Go语言切片长度和容量

Go语言中的切片(Slice)是对数组的一个连续片段的引用。它是一个动态数组,可以按需增长或缩小。切片有两个非负长度属性,分别是长度和容量。

切片长度

切片的长度是指切片中元素的个数,可以通过内置的len()函数来获取。例如,定义一个整型切片s,然后添加元素到切片中,使用len(s)就可以得到切片的长度。

```go s := make([]int, 5) // 定义一个长度为5的切片 fmt.Println(len(s)) // 输出5 ```

切片的长度可以随着元素的添加或删除而改变。当添加新元素时,长度会增加;当删除元素时,长度会减小。例如:

```go s = append(s, 1, 2, 3) // 添加3个元素 fmt.Println(len(s)) // 输出8 s = append(s[:3], s[4:]...) // 删除第4个元素 fmt.Println(len(s)) // 输出7 ```

切片容量

切片的容量是指在不重新分配内存的情况下,切片可以容纳的元素个数。可以通过内置的cap()函数来获取切片的容量。切片的容量可以根据需要自动增长,但不能超过底层数组的长度。

```go s := make([]int, 5, 10) // 定义一个长度为5、容量为10的切片 fmt.Println(cap(s)) // 输出10 ```

当切片的长度超过了其容量时,切片就会重新分配内存,底层的数组将被新的更大的数组替换。例如,将切片的长度增加到超过其容量:

```go s = append(s, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) // 添加10个元素 fmt.Println(len(s), cap(s)) // 输出15, 20 ```

切片长度和容量之间的关系

切片的长度和容量之间有着密切的关系。切片的长度不能超过其容量,但可以小于等于其容量。

初始化一个切片时,如果只指定了长度而没有指定容量,则切片的长度和容量相等。例如:

```go s := make([]int, 5) // 长度和容量都为5的切片 fmt.Println(len(s), cap(s)) // 输出5, 5 ```

如果在初始化切片时同时指定了长度和容量,那么切片的长度和容量就不相等。例如:

```go s := make([]int, 5, 10) // 长度为5,容量为10的切片 fmt.Println(len(s), cap(s)) // 输出5, 10 ```

切片可以通过切片操作来改变其长度和容量。切片操作会创建一个新的切片,新切片与原切片共享底层数组,但是具有不同的长度和容量。

```go s := []int{1, 2, 3, 4, 5} // 创建一个初始长度和容量都为5的切片 s1 := s[:3] // 指定长度为3,容量为5的切片 fmt.Println(len(s1), cap(s1)) // 输出3, 5 ```

总结来说,切片的长度是指切片中元素的个数,可以随着元素的添加或删除而改变;切片的容量是指切片可以容纳的元素个数,在不重新分配内存的情况下,可以根据需要自动增长。切片的长度不能超过其容量,但可以小于等于其容量。

相关推荐