「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
数组
定义
同一种数据类型的固定长度的序列。
- 数组定义:var a [len]int , 数组长度是常量,且是类型的组成部分,一旦定义长度就不能变
- 长度是组数类型的一部分,因 var a[5] int 和 var a [10]int 是不同的类型
- 数组遍历
for i:=0; i< len(a); i++ {
}
for index, v := range a {
}
- 访问越界,会 panic
- 数组是值类型,赋值和传参会复制整个数组,而不是指针,因此改变副本的值,不会改变本身的值
- 支持 == ,!= 操作符,因内存总是被初始化过
- 指针数组 [n]*T , 数组指针 *[n]T
初始化
# 全局初始化,必须要使用 var
var arr [5]int = [5]int{1,2,3} // 未赋值都将默认为 0
var arr1 = [5]int{1,2,3,4,5}
var arr2 = [...]int{1,2,3,4,5,6}
var str = [5]string{3:"hi",4:"tom"} //其余将默认为空字符串
# 局部初始化
a := [3]int{1, 2} // 未初始化元素值为 0。
b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组长度。
c := [5]int{2: 100, 4: 200} // 使用索引号初始化元素。
数组拷贝和传参数
因数组是引用类型,可以通过使用指针的方式,进行数组的拷贝和传参
切片
定义
定义:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。
- 切片的长度可以改变,因此,切片是一个可变的数组
- 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。
- cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。
所以,切片 slice 类似数组,但是 slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案
切片初始化
全局:
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[start:end]
var slice1 []int = arr[:end]
var slice2 []int = arr[start:]
var slice3 []int = arr[:]
var slice4 = arr[:len(arr)-1] //去掉切片的最后一个元素
局部:
arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
slice5 := arr[start:end]
slice6 := arr[:end]
slice7 := arr[start:]
slice8 := arr[:]
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素