数组
数组是一种数据类型元素的集合。在Go语言中,数组在声明时就必须确定它的数据类型以及长度,虽然数组在使用时可以修改其数据,但是数组大小无法改变。它可以存储相同类型的固定长度的数据序列。数组的长度是类型的一部分,所以不同长度的数组是不兼容的。数组可以通过索引来访问或修改元素,索引从 0 开始,第一个元素的索引为 0,第二个元素的索引为 1,以此类推。
数组的定义
数组在定义时的长度必须是常量,数组的长度也是数组类型的一部分。不同长度的数组是不同类型的。例如[10]int和[100]int是不同的类型。
var 数组变量名 [元素数量]T
var a [5]int
var b [50]int
数组的初始化
数组必须经过初始化才可以使用。
// 声明并初始化一个长度为 5 的整数数组
var arr2 = [5]int{1, 2, 3, 4, 5}
// 使用简短声明语法声明并初始化一个长度为 5 的整数数组
arr3 := [5]int{1, 2, 3, 4, 5}
遍历数组
数组遍历可以通过for i...的方式或者for range的方式。
func main() {
arr := [...]string{"aaa", "bbb", "ccc", "ddd"}
//通过for i的方式进行遍历
for i:=0; i<len(arr); i++ {
fmt.Println(arr[i])
} //aaa //bbb //ccc //ddd
//通过for range的方式进行遍历
//index表示索引,value表示值
for index, value := range arr {
fmt.Println(index, value)
} //0 aaa //1 bbb //2 ccc //3 ddd
}
多维数组
定义
多维数组在定义上与一维数组几乎一致,只是在内层又嵌套了几层。
// 声明一个二维整数数组
var arr5 [2][3]int
// 声明并初始化一个二维整数数组
var arr6 = [2][3]int{{1, 2, 3}, {4, 5, 6}}
多维数组的遍历
多维数组的遍历与一维数组的遍历几乎一致
func main(){
arr := [3][2]string{
{"广东","广州"},
{“云南”,“贵州”},
{"河南”,"常州”},
}
for _,row := range arr{
for _,val :=range row{
fmt.Printf("%v\t",val)
}
fmt.Printf()
}
切片
切片是一种动态数组,它可以在运行时改变长度和容量,而不需要重新分配内存。切片是对底层数组的一个连续片段的引用,所以修改切片的元素会影响底层数组。切片有三个属性:长度、容量和指针。长度是切片中元素的个数,容量是从切片的指针开始到底层数组的末尾的元素个数,指针是指向底层数组中切片第一个元素的地址。
有多种方式可以创建和初始化切片,例如:
- 从数组或切片中截取一段,使用 slice[start:end] 的语法,其中 start 和 end 是索引值,可以省略。
- 使用 make 函数,指定切片的类型、长度和容量,例如 make([]int, 5, 10)。
- 使用字面量,直接给切片赋值,例如 []int{1, 2, 3}。
切片可以使用 append 函数来追加元素,如果切片的容量不够,会自动扩展底层数组。切片也可以使用 copy 函数来复制元素,如果目标切片的容量小于源切片的长度,只会复制部分元素。
切片的表达式
我们可以通过len()来获取切片的长度,也可以使用cap()来获取切片的容量。
切片表达式有两种,一种是只指定low和high两个索引界限值,还有一种是除了low和high还要指定容量。
通过上面的学习,我们了解到了切片的底层也是数组,因此我们可以通过切片表达式来得到切片。切片表达式中的low和high表示索引范围(左包含,右不包含)。而得到的新切片的长度=high-low,而新切片的容量=原切片的长度-low。
n := [5]int{1, 2, 3, 4, 5} // 声明一个长度为 5 的数组
n1 := n[1:] // 从 n 数组中截取,省略了 high,默认为数组的长度
fmt.Println(n1) // 输出 [2 3 4 5]
n2 := n1[1:3] // 从 n1 切片中截取,指定了 low 和 high
fmt.Println(n2) // 输出 [3 4]
n := [5]int{1, 2, 3, 4, 5} // 声明一个长度为 5 的数组
n1 := n[1:3:4] // 从 n 数组中截取,指定了 low、high 和 max
fmt.Println(n1) // 输出 [2 3]
fmt.Println(cap(n1)) // 输出 3