1、数组

数组是一系列相同数据类型、固定长度的数据项集合,不同长度的相同数据类型的数组属于不同类型,例如:[5]int和[10]int属于不同类型。
数组的长度一旦声明,不可以动态改变,需要动态改变参考切片的使用。数组长度上限为2GB。
数组的下标从0开始,上限为数组的长度-1。

  1. //声明数组
  2. var arr1 [5]int
  3. //遍历数组,取数组长度,元素赋值
  4. for i:=0; i < len(arr1); i++ {
  5. //元素赋值
  6. arr1[i] = i * 2
  7. }
  8. //遍历数组,取数组长度,取出元素
  9. for i:=0; i < len(arr1); i++ {
  10. //取出元素
  11. fmt.Printf("Array at index %d is %d\n", i, arr1[i])
  12. }
  13. //for-range遍历数组,取出元素
  14. for i := range a {
  15. //取出元素
  16. fmt.Printf("Array at index %d is %d\n", i, arr1[i])
  17. }

2、切片

2.1、用法一:对数组连续片段的引用

从数组中取出一个连续的片段作为切片,切片是一个引用类型,对切片元素的值进行修改,会影响到原数组的元素值。
var slice1 []type = arr1[start:end] ,切片slice1 是由数组 arr1 从 start 索引到 end-1 索引之间的元素构成的子集。
var slice1 []type = arr1[:] ,切片slice1 就等于完整的 arr1 数组。
var slice1 []type = arr1[2:] , 切片slice1 是由数组从第三个到最后的所有元素。
var slice1 []type = arr1[:3] , 切片slice1 是由数组从第一个到第三个元素。

  1. var arr1 [6]int
  2. var slice1 []int = arr1[2:5]

切片有两个内置函数len()cap()
len()用来获取切片已有元素的长度。
cap()用来获取切片最大伸展长度,上限为切片从数组来源的start下标到数组末尾的长度。举例:

  1. arr1 := [5]int{0, 1, 2, 3, 4}
  2. slice1 := arr1[1:2]
  3. fmt.Println(cap(slice1))
  4. //输出4
  5. //因为切片slice1的开始位置是数组arr1第2位,数组arr1最大长度为5,所以slice1伸展长度是从第2位到数组的末尾。

2.2、用法二:集合

声明切片时,不指定长度,可以动态的改变切片的大小,长度上限为2GB。

  1. //声明切片
  2. sl3 := []int{1, 2, 3}
  3. //添加元素
  4. sl3 = append(sl3, 4, 5, 6)
  5. fmt.Println(sl3)

2.2.1、复制切片

  1. sl_from := []int{1, 2, 3}
  2. sl_to := make([]int, 10)
  3. n := copy(sl_to, sl_from)
  4. fmt.Println(sl_to)
  5. fmt.Printf("Copied %d elements\n", n) // n == 3