切片容量
Coddy Go 中的切片和映射 课程的第 7 课,共 21 课。
处理切片时,容易让人困惑的一点是长度和容量之间的区别。在这节课中,我们将深入了解切片的容量是什么。
好了,我们开始吧。这个声明会创建一个新的切片,如下所示:
var names []string这是一个新切片,因此它没有底层数组,所以它的所有字段都为零值。
对这个切片使用 <strong>len</strong> 函数或 <strong>cap</strong> 函数时,两者都会返回 0。不过,如果改用切片字面量,Go 就会创建一个新的底层数组:
names := []string{"Python", "Java", "Rust"}这个切片字面量中有 3 个元素,所以 <strong>names</strong> 切片的底层数组也有 3 个元素。因此,容量是切片底层数组的长度,而不是切片本身的长度。
为了更好地理解这一点,我们来看另一个例子:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]想一想:这个例子中切片 <strong>nameSlice</strong> 的容量是多少?
答案是 4。这里我们从索引 1 开始,一直到切片的末尾,可以这样验证:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))结果如下:
[Golang Rust JavaScript Haskell]
4记住,计算容量时,我们从切片的第一个位置数到末尾。
即使我们这样做:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:4]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))这里长度发生了变化,我们只得到 <strong>three elements</strong>:
[Golang Rust JavaScript]
4但容量仍然相同。请注意:长度并不总是等于容量。
挑战
简单在给定的代码中,我们定义了一个包含 10 个元素的切片。
- 执行切片操作来创建另一个切片,并在屏幕上打印它的容量。容量应该等于 6。
亲手试试
package main
import (
"fmt"
)
func main() {
// 包含 10 个元素的切片
lang := []string{"Python", "Java", "JavaScript", "C++", "Go", "Ruby", "Swift", "Rust", "PHP", "Kotlin"}
// 在这里进行切片操作
// 完成 Print 函数
fmt.Println("the capacity of this Slice is :" ?)
}Go 中的切片和映射中的所有课
自己练习: Go 在线编译器