天天看点

go语言——slice切片

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)
}