slice切片声明方式
1.定义切片方式,声明slice1是一个切片,并且初始化,默认值为1,2,3,长度为3
2.声明slice2是一个切片,但是并没有给slice分配空间,长度为0,里面没有任何值
用make为slice2开辟一个长度为3的int型数据,值全部为0
给切片长度赋值
3.将第二方式结合在一起,声明slice1是一个切片,并开辟空间,3个空间,初始化值为0
var slice3[]int=make([]int,3)
slice3[0]=11
4.将第三种方式简化一下,通过:=推到出slice是一个切片(最常用)
slice4:=make([]int,3)
slice4[0]=22
判断一个slice是否为空
if slice1==nil{
fmt.Println("slice1 是一个空切片")
}else{
fmt.Println("slice1不是空切片")
}
slice切片的使用方式
1.切片容量的追加
//1.指定初始cap
//定义一个切片长度为3,容量为5的切片numbers
var numbers=make([]int,3,5)
fmt.Printf("len=%d,cap=%d,slice=%v\n",len(numbers),cap(numbers),numbers)
//向切片numbers追加一个值为1的元素,numbers len=4,cap=5,[0,0,0,1]
numbers=append(numbers,1)
//向切片numbers追加一个值为1的元素,numbers len=5,cap=5,[0,0,0,1,2]
numbers=append(numbers,2)
//此时cap容量已经满了,切片会动态开辟初始容量那么大的空间
//向切片numbers追加一个值为1的元素,numbers len=6,cap=10,[0,0,0,1,2,3]
numbers=append(numbers,3)
//2.没有指定初始cap
var numbers1=make([]int,3)
//numbers len=3,cap=3,[0,0,0]
fmt.Printf("len=%d,cap=%d,slice=%v\n",len(numbers1),cap(numbers1),numbers1)
//numbers len=4,cap=6,[0,0,0,1]
numbers1=append(numbers1, 1)
fmt.Printf("len=%d,cap=%d,slice=%v\n",len(numbers1),cap(numbers1),numbers1)
2.切片容量的截取
func main() {
s:=[]int{1,2,3}
//s1=[1,2],这种方式s1和s指向同一个地址
s1:=s[0:2]
fmt.Println(s1)
//修改第一个值之后,切片s和s1都发生了改变
s1[0]=10
//s=[10,2,3]
fmt.Println(s)
//s=[10,2]
fmt.Println(s1)
s2:=make([]int,3)
//copy可以将底层数组的slice一起进行拷贝,重新开辟了存储空间,深拷贝。此时修改切片里面的值是不会两个切片一起变的
copy(s2,s)
println(s2)
}