数组
数组是有着类型相同的元素且长度固定的集合
数组的声明必须要指定类型和长度,且长度是无法改变的。声明时不赋值,数组会自动初始化数组类型的空值。
// 声明并赋值
a1 := [5]int{1,2,3,4,5}
// 声明空整数数组
a2 := [5]int{}
数组是值类型
通过格式化%p可以看出来如果不使用&符号是无法打印地址。
fmt.Printf("%p ---- %p \n",a1,&a1)
输出结果为:
%!p([5]int=[1 2 3 4 5]) ---- 0xc00001a1e0
切片(slice)
切片是对数组一个连续片段的引用,所以切片是引用类型。切片在make初始化时长度和容量可以传入两个参数,第一参数长度(不为空),第二个参数是容量。
切片的长度声明效果和数组是一样,初始化切片声明类型的空值。
对切片长度追加可以使用append函数,当追加的切片长度超过容量,欺骗就会分配一个新的底层数组(指向地址会变)。在切片的容量小于 1000 个元素时,总是会成倍地增加容量。一旦元素个数超过 1000,容量的增长因子会设为 1.25,也就是会每次增加 25%的容量(随着语言的演化,这种增长算法可能会有所改变)。
s1 := make([]int,0,4)
for i := 0;i<10;i++ {
s1 = append(s1,i)
fmt.Printf("s1 元素:%v , 地址:%p 长度:%d 容量:%d\n ",s1,s1,len(s1),cap(s1))
}
输出结果:
s1 元素:[0] , 地址:0xc000016120 长度:1 容量:4
s1 元素:[0 1] , 地址:0xc000016120 长度:2 容量:4
s1 元素:[0 1 2] , 地址:0xc000016120 长度:3 容量:4
s1 元素:[0 1 2 3] , 地址:0xc000016120 长度:4 容量:4
s1 元素:[0 1 2 3 4] , 地址:0xc00001c140 长度:5 容量:8
s1 元素:[0 1 2 3 4 5] , 地址:0xc00001c140 长度:6 容量:8
s1 元素:[0 1 2 3 4 5 6] , 地址:0xc00001c140 长度:7 容量:8
s1 元素:[0 1 2 3 4 5 6 7] , 地址:0xc00001c140 长度:8 容量:8
s1 元素:[0 1 2 3 4 5 6 7 8] , 地址:0xc00008a080 长度:9 容量:16
s1 元素:[0 1 2 3 4 5 6 7 8 9] , 地址:0xc00008a080 长度:10 容量:16
有疑问加站长微信联系(非本文作者)