1、数组
数组是一系列相同数据类型、固定长度的数据项集合,不同长度的相同数据类型的数组属于不同类型,例如:[5]int和[10]int属于不同类型。
数组的长度一旦声明,不可以动态改变,需要动态改变参考切片的使用。数组长度上限为2GB。
数组的下标从0开始,上限为数组的长度-1。
//声明数组
var arr1 [5]int
//遍历数组,取数组长度,元素赋值
for i:=0; i < len(arr1); i++ {
//元素赋值
arr1[i] = i * 2
}
//遍历数组,取数组长度,取出元素
for i:=0; i < len(arr1); i++ {
//取出元素
fmt.Printf("Array at index %d is %d\n", i, arr1[i])
}
//for-range遍历数组,取出元素
for i := range a {
//取出元素
fmt.Printf("Array at index %d is %d\n", i, arr1[i])
}
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 是由数组从第一个到第三个元素。
var arr1 [6]int
var slice1 []int = arr1[2:5]
切片有两个内置函数len()
和cap()
。len()
用来获取切片已有元素的长度。cap()
用来获取切片最大伸展长度,上限为切片从数组来源的start下标到数组末尾的长度。举例:
arr1 := [5]int{0, 1, 2, 3, 4}
slice1 := arr1[1:2]
fmt.Println(cap(slice1))
//输出4
//因为切片slice1的开始位置是数组arr1第2位,数组arr1最大长度为5,所以slice1伸展长度是从第2位到数组的末尾。
2.2、用法二:集合
声明切片时,不指定长度,可以动态的改变切片的大小,长度上限为2GB。
//声明切片
sl3 := []int{1, 2, 3}
//添加元素
sl3 = append(sl3, 4, 5, 6)
fmt.Println(sl3)
2.2.1、复制切片
sl_from := []int{1, 2, 3}
sl_to := make([]int, 10)
n := copy(sl_to, sl_from)
fmt.Println(sl_to)
fmt.Printf("Copied %d elements\n", n) // n == 3