var array [len]type[len]type数组的长度也是属于数组的类型,并且数组最大是2GB,必须声明数组长度
go中数组是一种值类型,所以在进行赋值时,会将一个数组中的所有在内存中进行拷贝,使用new函数可以减少开销
var arr=new([5]int)arr就是一个*[5]int类型,可以直接进行地址传递,不需要进行将所有值进行拷贝
var array=[4]int{2,3,4,5}
var arrLazy = [...]int{5, 6, 7, 8, 22}//这个是偷懒语法,是自动数后面有几个
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
//这个是指定[3]和[4]的值
//下面两个得到的都是切片
var arrLazy = []int{5, 6, 7, 8, 22}
var arrKeyValue = []string{3: "Chris", 4: "Ron"}多维数组
[3][5]int
[2][2][2]int切片是数组对于一个连续片段的引用,通常是匿名的,切片也是一个长度可变的数组
使0<=len(s)<=cap(s),s的容量最大是cap(s),目前s的长度是len(s)
使用引用是不需要使用额外的内存的,并且比数组更有效率
var array []type不需要长度,只这样写,得到的是array是nil,长度是0
初始var slice []type=array[start:end],左包括右不包括,start、end可以省略:必须要有,切片就是一个指针,不需要使用指针指向它
修改就是直接修改底层的值
在传递切片时需要在参数位置进行切sum(arr[:]),如果说函数在定义时没有指定数组大func sum(a []int),说明只能传递切片,因为数组大小也是数据类型的一部分。
使用make也可以定义一个切make([]type,len,cap),cap时可选参数
切片的结构
new([100]int,)[:20]也可以做到定义切片(使用new申请了一个内存100个int,使用切片拿了20个实现切片)
new申请的切片只能放100个int,而使用[:]没有这个限制
切片只能向后扩展不能向前扩展,如果一个切片a[3:45]a就可应变a[3:87],但是不能变a[1:45]
- new(T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 *T 的内存地址:这种方法返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体;它相当于 &T{}。
- make(T) 返回一个类型为 T 的初始值,它只适用于 3 种内建的引用类型:切片map 和 channel。这个初始值是一个结构体,结构体中存放了相关参数。
要创建string类型的切片需要先转成[]bytes,