数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的。
func main() {
//1.声明数组,并给数组的每个元素赋值
var arr [3]float32
arr[0]=1.1
arr[1]=2.2
arr[2]=3.3
//2.声明并初始化数组
//2.1
var arr2 [3]int=[3]int{1,2,3}
//2.2 等价于
arr3 :=[3]int{1,2,3}
//3.使用...让Golang语言自己根据实际情况来分配空间
arr4 :=[...]int{1,2,3,4}
//使用 fmt 的 %T 打印数据类型
//数组[1.100000 2.200000 3.300000] 的类型是 [3]float32
fmt.Printf("数组%d 的类型是 %T\n",arr,arr)
//数组[1 2 3] 的类型是 [3]int
fmt.Printf("数组%d 的类型是 %T\n",arr2,arr2)
//数组[1 2 3] 的类型是 [3]int
fmt.Printf("数组%d 的类型是 %T\n",arr3,arr3)
//数组[1 2 3 4] 的类型是 [4]int
fmt.Printf("数组%d 的类型是 %T\n",arr4,arr4)
}
func main() {
//切片的构造
arr := [5]int{1,2,3,4,5}
//1.表示从索引1开始,知道索引为2的元素
slice1 := arr[1:3]
//slice1 的长度为:2,容量为:4
fmt.Printf("slice1 的长度为:%d,容量为:%d\n", len(slice1), cap(slice1))
/*
在切片时,若不指定第三个数,那么切片终止索引会一直到原数组的最后一个数。
而如果指定了第三个数,那么切片终止索引只会到原数组的该索引值。
即第三个数组不影响长度,影响容量
*/
slice2 := arr[1:3:3]
//slice2 的长度为:2,容量为:2
fmt.Printf("slice2 的长度为:%d,容量为:%d\n", len(slice2), cap(slice2))
//2.声明一个未指定大小的数组来定义切片,切片不需要说明长度
//声明整型切片
var numList []int
//numList 的长度为:0,容量为:0
fmt.Printf("numList 的长度为:%d,容量为:%d\n", len(numList), cap(numList))
//3.make()函数创建切片
//make([]T, length, capacity) 其中capacity为可选参数
slice3 := make([]int, 6)
//slice3 的长度为:6,容量为:6
fmt.Printf("slice3 的长度为:%d,容量为:%d\n", len(slice3), cap(slice3))
}
len() 和 cap() 函数
切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
func main() {
//直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s := []int{1,2,3}
//s 的长度为:3,容量为:3
fmt.Printf("s 的长度为:%d,容量为:%d\n", len(s), cap(s))
arr := [...]int{1,2,3,4}
//切片s2直接引用数组arr
//s2 的长度为:4,容量为:4
s2 := arr[:]
fmt.Printf("s2 的长度为:%d,容量为:%d\n", len(s2), cap(s2))
//s := arr[startIndex:endIndex] 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
//arr[start:] 表示从start一直截取到最后一元素
//arr[:end] 表示从第一个元素开始截取到最后一个元素
s3 := arr[0:2]
//s3 的长度为:2,容量为:4
fmt.Printf("s3 的长度为:%d,容量为:%d\n", len(s3), cap(s3))
//切片之间相互进行初始化
s4 := s3[1:2]
//s4 的长度为:1,容量为:3
fmt.Printf("s4 的长度为:%d,容量为:%d\n", len(s4), cap(s4))
}
注:一个切片在未初始化之前默认为 nil,长度为 0
func main() {
var nslice []int
//切片[]的长度为0
printSlice(nslice)
//向切片中添加一个元素
nslice=append(nslice, 1)
//切片[1]的长度为1
printSlice(nslice)
//向切片中同时添加多个元素
//切片[1 2 3 4 5]的长度为5
nslice=append(nslice, 2,3,4,5)
printSlice(nslice)
nslice2 := make([]int,2*len(nslice))
copy(nslice2,nslice)
//切片[1 2 3 4 5 0 0 0 0 0]的长度为10
printSlice(nslice2)
}
func printSlice(x []int){
fmt.Printf("切片%v的长度为%d\n",x,len(x))
}