数组(Array)
- 数组是同一类元素的集合,在使用前需要先声明,可以修改数组中的元素,但是数组的长度是不可变的。
//定义个数组
// var 数组变量名 [数组的长度,元素个数]数组类型
var images [3]int
数组的长度必须是常量,数组长度一旦定义不可以改变
- 数组初始化
// 第一种
func main(){
var a [2]int
var names [3]string
var num [2]int{1, 2} // 初始化时指定初始值
}
// 第二种
var a [2]int
var names [...]int{1, 2} // 使用...根据数组实际长度获取长度
// 指定索引
a := [...]int{1: 2, 3: 3} // [0 2 0 3]
- 数组的遍历
//数组的遍历可以使用for循环实现
var a [3]int{1, 3, 4}
for i:=0; i < len(a); a++{
fmt.Println(a[i])
}
// 使用range实现遍历
for index, value := range a{
fmt.Println(index, value)
}
- 多维数组
多维数组就是在数组中还是数组
数组是值类型,赋值和传参会复制整个数组,因此会copy一个副本,保留原数组
数组支持==
、!=
操作符,因此内存总是被初始化过的
[n]T表示指针数组,[n]T表示数组指针
// 多维数组的使用,实现二维数组
func main(){
a := [3][2]int{{1,2}, {3, 4}, {5, 6}}
// [[1 2] [3 4] [5 6]]
}
//获取多维数组中的值可以使用索引的方式获取
// 多维数组遍历需要使用多个for循环进行遍历,即遍历内部的数组
// 多维数组只有一层可以使用 [...] 让编译器推导数组的长度
a := [...][2]int{{1,2}, {3, 4}, {5, 6}}
切片
切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。类似于python的列表。
切片是一个引用类型,它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。
- 切片定义
// var 切片名 []切片类型
var name []int
// 初始化
var a []int{1,3}
var c []bool{false, true}
-
切片的长度和容量
切片的长度使用len
内置函数, 容量使用cap
内置函数 -
切片表达式
切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种变体:一种指定low和high两个索引界限值的简单的形式,另一种是除了low和high索引界限值外还指定容量的完整的形式。 -
切片的本质
切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)
- 使用make()函数构造切片
使用make()函数可以动态创建数组
// make([]T, size, cap)
/*
T:切片的元素类型
size:切片中元素的数量
cap:切片的容量
*/
- 获取切片中的值
该方法类似于python列表的切片,遵循左闭右开原则
a := [5]int{1, 2, 3, 4, 5}
aa := a[1:3] // [2. 3]
- 判断切片长度
// 判断数组为空
len(s) == 0
// 不适用len(s) == nil