数组:
在 Go 语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块。
数组是一种非常有用的数据结构,因为其占用的内存是连续分配的。由于内存连续,CPU能把正在使用的数据缓存更久的时间。而且内存连续很容易计算索引,可以快速迭代数组里的所有元素。数组的类型信息可以提供每次访问一个元素时需要在内存中移动的距离。既然数组的每个元素类型相同,又是连续分配,就可以以固定速度索引数组中的任意数据,速度非常快。
使用数组字面量声明数组:
// 声明一个包含 5 个元素的整型数组
// 用具体值初始化每个元素
array := [5]int{10, 20, 30, 40, 50}
在函数间传递数组要使用数组的指针,因为函数传递会复制参数。
切片:
切片是一个很小的对象,对底层数组进行了抽象,并提供相关的操作方法。切片有 3 个字段的数据结构,这些数据结构包含 Go 语言需要操作底层数组的元数据。这 3 个字段分别是指向底层数组的指针、切片访问的元素的个数(即长度)和切片允许增长
到的元素个数(即容量)。
使用切片字面量来声明切片:
// 创建字符串切片
// 其长度和容量都是 5 个元素
slice := []string{"Red", "Blue", "Green", "Yellow", "Pink"}
计算长度和容量:
对底层数组容量是 k 的切片 slice[i:j]来说
长度: j - i
容量: k - i
对于 slice[i:j:k] 或 [2:3:4]来说:
长度: j – i
容量: k – i
// 将两个切片追加在一起,并显示结果
fmt.Printf("%v\n", append(s1, s2...))
迭代切片:
for 或者 range,需要强调的是,range 创建了每个元素的副本,而不是直接返回对该元素的引用
切片增长:
在底层数组里还有额外的容量可用,append 操作将可用的元素合并到切片的长度,并对其进行赋值。
如果切片的底层数组没有足够的可用容量,append 函数会创建一个新的底层数组,将被引用的现有的值复制到新数组里,再追加新的值
使用切片时,最好设置切片长度和容量一致,这样调用append的时候,会创建一个新的底层数组而不会修改原来的底层数组。