Loading...

文章背景图

go基础:数组与切片

2026-07-20
0
-
- 分钟
|
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,而使用[:]没有这个限制

ptr(切片起始位置的地址)

len(目前切片的大小)

cap(最大的切片大小)

切片只能向后扩展不能向前扩展,如果一个切片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,

评论交流

文章目录