建议使用切片而不是数组
数组的长度是固定的,无法添加
切片的长度不固定,不是数组
空切片指向内存地址为0的空间
切片名本身就是一个地址
切片的定义var slice []int
切片的简单使用以及赋值
func main10() {
//第一种
var slice []int //空切片
slice=append(slice,1,2,3) //追加数据
fmt.Println(slice)
fmt.Println(len(slice)) //打印切片长度
fmt.Println(cap(slice)) //打印切片容量
//第二种
var s1 []int=[]int{1,2,3,4}
fmt.Println(s1)
s2:=[]int{1,3,4,5,6}
fmt.Println(s2)
//第三种
//切片长度小于容量
s:=make([]int,5,10) //长度5,容量10
fmt.Println(s)
//下标赋值
s[0]=1
s[1]=3
s= append(s, 1,2,3,4,5,7,8,9)
fmt.Println(s)
for i:=0;i<len(s);i++ { //不能使用容量来结束
s[i]=i
}
fmt.Println(s)
for q,w:=range s{
fmt.Println(q,w)
}
}
打印出结果为
3
3
[1 2 3 4]
[1 3 4 5 6]
[0 0 0 0 0]
[1 3 0 0 0 1 2 3 4 5 7 8 9]
[0 1 2 3 4 5 6 7 8 9 10 11 12]
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
Process finished with the exit code 0
切片地址与扩容
- 在使用append追加数据时,长度超过容量是容量会自动扩充
- 一般是容量*2,如果超过1024字节,每次扩容上一次1/4
- 容量扩容每次都是偶数
func main11() {
var slice []int
fmt.Printf("%p\n",slice)
//当使用append进行追加数据时,切片地址可能会发生改变
slice=append(slice,12,3,4,56,7,8,9)
fmt.Printf("%p\n",slice)
slice=append(slice,112,31,42,563,74,82,91)
fmt.Println(slice)
fmt.Printf("%p\n",slice)
fmt.Printf("%p\n",&slice[3])
//在使用append追加数据时,长度超过容量是容量会自动扩充
//一般是容量*2,如果超过1024字节,每次扩容上一次1/4
//容量扩容每次都是偶数
切片的复制与排序
func main13() {
//copy
var s1 []int=[]int{3,21,35,14,85}
s2:=make([]int,5)
//要复印的在前,被复印的在后
//内容独立,内存地址不同
//修改一个不会影响另一个
copy(s2,s1)
fmt.Println(s2)
s1[3]=44444
s1 =append(s1,55,26,78,18)
fmt.Println(s1)
fmt.Println(s2)
for i:=0;i<len(s1)-1;i++ {
for j:=0;j<len(s1)-1-i;j++ {
if s1[j]>s1[j+1] {
s1[j],s1[j+1]=s1[j+1],s1[j]
}
}
}
fmt.Println(s1)
切片作为函数参数
如果函数中使用append
进行数据添加,形参地址发生改变就不会指向实参的地址,多加注意
//切片作为函数参数
func main14(s []int) []int {
//fmt.Println(s)
//s[0]=15
//fmt.Println(s)
//fmt.Printf("%p\n",s)
s= append(s, 6,7,8,9) //append函数可能会改变函数的地址,如果不用返回值,无法改变实参的值
fmt.Println(s)
return s //返回值
}
func main() {
//切片名就是一个地址
slice:=[]int{1,2,3,4,5}
//地址传递,等同于传递一个地址过去
slice=main14(slice) //返回值改变slice的地址,指向同一个
fmt.Println(slice)
//fmt.Printf("%p\n",slice)
//s和slice的地址相同
}
原理图原理
慕课网补充知识
切片可以向后拓展,但不可以向前拓展
arr:=[]int{0,1,2,3,4,5,6,7}
s1:=arr[2:6]
fmt.Println(s1)
s2:=s1[3:5] //[2 3 4 5]
//fmt.Println(s2[4]) 报错 不存在
fmt.Println(s2) //[5 6] cap容量的关系
//切片可以先后拓展,但不可以向前拓展
//s[i]不可以超越len(s),向后拓展不可以超越底层数组cap(s)