原文翻译: https://go.dev/blog/slices-intro
介绍
go语言的slice类型提供一种方便快捷的数据类型。切片类似于其他语言的数组, 但也有些不同的属性。接下来会介绍什么是 slice 并且如何使用。
数组
切片类型是构建于数组类型之上的,所以理解切片之前必须先理解数组。
一个数组类型的定义有长度和元素类型。例如
[4]int
相当与一个数组有 4 个 int 类型。数组的长度是固定;数组长度的一部分是数组的类型([4]int and [5]int 是冲突的不同类型)。数组可以通过索引获取元素,例如
s[n]
可以获取到第 n 个元素,当然索引是从零开始;
var a [4]int
a[0] = 1
i := a[0] // i == 1
数组不需要显示的初始化;每个元素都是对应类型的零值
// a[2] == 0, the zero value of the int type
[4]int 是 4 个 int 值,在内存中是连续空间
image
数组是一组 value 组成。一个数组变量表示一个全部的数组;它不是指向第一个数组元素的指针(就像 C 中的情况一样)。这就意味着当你赋值或传递的数组都是内容拷贝。(传递一个指针数组可以避免内容拷贝,但是那是一个指针,不是数组)。一个思路是数组是固定长度复合类型且有索引的短结构体而不是命名字段。
字面表达,例如:
b := [2]string{"Penn", "Teller"}
或者用编译器计算元素总数:
b := [...]string{"Penn", "Teller"}
这两个方式,变量b 都表示 [2]string
完(上半部)