Menu
CoddyTech

切片容量

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

但容量仍然相同。请注意:长度并不总是等于容量。

challenge icon

挑战

简单

在给定的代码中,我们定义了一个包含 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 在线编译器