数组是具有相同类型的一组长度固定的数据序列
- 如果想让数组中的元素为任意类型,可以使用空接口作为数组的类型
数组声明方式
var identifier [len]type
数组初始化方式
- for循环初始化数组
var arr1 [5]int
// for循环初始化数组
for i:=0; i < len(arr1); i++ {
arr1[i] = i * 2
}
复制代码
- new函数创建数组
var arr1 = new([5]int)
复制代码
通过new函数创建数组,返回的是指针类型的数组变量 *[5]int
- 数组常量方式创建数组
var arr1 = [5]int{18, 20, 15, 22, 16}
var arr2 = [...]int{5, 6, 7, 8, 22}
var arr3 = []int{5, 6, 7, 8, 22} //注:初始化得到的实际上是切片slice
var arr4 = [5]string{3: "Chris", 4: "Ron"}
复制代码
数组在函数中传递
大数组在函数中传递会消耗很多内存,可以通过传递数组指针或者使用数组切片来避免
切片
- 切片是对数组一个连续片段的引用(切片是一个引用类型)
切片声明与初始化方式
// 切片声明
var identifier []type
// 初始化
// 表示 slice1 是由数组 arr1 从 start 索引到 end-1 索引之间的元素构成的子集
var slice1 []type = arr1[start:end]
复制代码
切片的内存结构
切片实际上是一个结构体,用三个字段:指向相关数组的指针,切片长度,切片容量
make()函数创建切片
如果切片相关的数组还没定义,可以先用make()函数创建切片
var slice1 []type = make([]type, len)
slice2 := make([]type, len)
slice3 := make([]type, len, cap)
复制代码
- make方法生成的切片的内存结构
make函数和new函数都可以生成切片
- make([]int, 2, 5)
- new([5]int)[2:5]
new()跟make()的区别
- new()为每个类型分配一片内存,初始化为0并且返回类型为*T的内存地址,** 适用于数组、结构体 **
返回一个指向类型为T,值为0的地址的指针,相当于&T{}
- make()返回一个类型为T的初始值,仅适用于三种内建的引用类型:切片、map和channel
切片重组
改变切片长度的过程称为切片重组(reslicing)
var ar = [10]int{0,1,2,3,4,5,6,7,8,9}
var a = ar[5:7] // 截断为{5,6},len = 2、capacity = 5
a = a[0:4] // 截断为{5,6,7,8},len = 4、capacity = 5
复制代码
入门教程推荐: github.com/Unknwon/the…