## 数组
数组是由相同类型元素的集合组成的数据结构,计算机会为数组分配一块连续的内存来保存其中的元素,为们可以利用数组中元素的索引快速访问特定元素。
声明
```
[10]int
[200]interface{}
```
示例
```
var arr [3]int
arr[0] = 1
arr[1] = 2
arr[2] = 3
```
---
## 切片
切片,即动态数组,其长度不固定,我们可以向切片中追加元素,它会在容量不足时自动扩容。
我们其实可以把切片看做是对数组的一层简单的封装,因为在每个切片的底层数据结构中,一定会包含一个数组。数组可以被叫做切片的底层数组,而切片也可以被看作是对数组的某个连续片段的引用。所以,Go 语言的切片类型属于引用类型。
我们通过调用内建函数`len`,得到数组和切片的长度。通过调用内建函数`cap`,我们可以得到它们的容量。
当一个切片无法容纳更多的元素的时候,切片就回去做扩容操作。但它并不会改变原来的切片,而是会生成一个容量更大的切片,然后把原有的元素和新元素一起拷贝到新切片中。在一般的情况下,你可以简单地认为新切片的容量(以下简称新容量)将会是原切片容量(以下简称原容量)的 2 倍。
但是,当原切片的长度(以下简称原长度)大于或等于1024时,Go 语言将会以原容量的1.25倍作为新容量的基准(以下新容量基准)。新容量基准会被调整(不断地与1.25相乘),直到结果不小于原长度与要追加的元素数量之和(以下简称新长度)。最终,新容量往往会比新长度大一些,当然,相等也是可能的。
声明
```
[]int
[]interface{}
```
示例
```
slice1 := []int{1, 2, 3}
slice2 := make([]int, 0)
// 添加元素
slice2 = append
fmt.Printf("slice len: %d \n", len(slice2))
fmt.Printf("slice len: %d \n", cap(slice2))
```