切片(slice)
因为数组的长度是不可变的 应用起来不够灵活 所以衍生出来切片
切片的长度是可变的
切片声明
var s = []int{}
创建一个长度为0的切片
var s = []int{1,2,3}
创建一个 长度为3的切片
var s = make([]int,10)
使用make创建一个长度为10的切片
var s = make([]int,10,20)
使用make创建一个长度为10的切片cap(容量)为20的切片
cap(容量)
var s = make([]int,2,4)
fmt.Println("s的长度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s的长度: 2
s的容量: 4
此时S的长度为2,容量为4。
var s = make([]int,2,4)
fmt.Println("s的长度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,3 )
fmt.Println(s)
fmt.Println("s的长度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,4 )
fmt.Println(s)
fmt.Println("s的长度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,5 )
fmt.Println(s)
fmt.Println("s的长度: ",len(s))
fmt.Println("s的容量: ",cap(s))
输出为:
s的长度: 2
s的容量: 4
[0 0 3]
s的长度: 3
s的容量: 4
[0 0 3 4]
s的长度: 4
s的容量: 4
[0 0 3 4 5]
s的长度: 5
s的容量: 8
-------------------------------------------------------------------------------------------------------------------------------------
当添加的元素时 超过S的容量
此时切片会自动扩容
扩容的方式为 当前长度 X 2
再具体的可以看看源码
注意事项
1.因为切片底层的扩容是 把扩容前的数组 复制到 扩容后的数组
为效率考虑 应该在一开始设定切片的容量(够用的容量)
切片是引用传递
var s = make([]int,2,4)
s[0] = 1
s[1] = 2
fmt.Println(s)
s2:=s
s2[1]=100
fmt.Println(s)
输出
[1 2]
[1 100]
当s2的元素值发生改变时 s的元素也发生了改变
可以看出 切片是引用传递
var s1 = []int{1,2,3,4,5,6}
s2 := s1[2:4]
fmt.Println("s1 = ",s1)
fmt.Println("s2 = ",s2)
s3:=s2[:4]
fmt.Println("s3 = ",s3)
输出
s1 = [1 2 3 4 5 6]
s2 = [3 4]
s3 = [3 4 5 6]
切片的底层就是一个数组,切片赋值时引用传递
s2 的长度虽然为2 在对S3赋值时 因为底层数组的原因 所以S3 = 3,4,5,6
append方法
var s = []int{1,2,3,4,5,6}
s= append(s,2 )
s = append(s,3,4,5 )
s = append(s, s...)
append 方法可以为切片添加元素
可以多个也可以当个
也可以是相同类型的切片
切片的遍历
切片的遍历和数组的遍历是一样的
for i:=0; i <len(s);i++{
fmt.Println(s[i])
}
for i,v := range s{
fmt.Println(i,v)
}
因为切片是引用传递 在赋值是都指向的是一个地址 所以!!COPY()
var a = []int{1,2,3,4,5,6}
var b = make([]int,10,20)
//将 a的元素拷贝到b里
copy(b,a)
fmt.Println("切片a的元素: ",a)
fmt.Println("切片b的元素: ",b)
fmt.Println("切片a的地址: ",&a[1])
fmt.Println("切片b的地址: ",&b[1])
输出为
切片a的元素: [1 2 3 4 5 6]
切片b的元素: [1 2 3 4 5 6 0 0 0 0]
切片a[1]的地址: 0xc00000c2d8
切片b[1]的地址: 0xc00010c008
可以看出 a,b元素的地址是不同的
元素的删除
go语言中没有对元素进行删除的函数
但是可以利用 append()函数来实现元素删除
var a = []int{1,2,3,4,5,6}
a = append(a[0:1],a[2:6]... )
fmt.Println(a)
输出为:[1 3 4 5 6]
删除了第二个元素