golang 之slice 变长数组
slice:就是变长数组,主要是因为array(数组)长度不可变,导致在使用的时候存在诸多限制,才有了slice;slice 主要包含3个部分:1、指针 2、容量 3、长度 ,由于slice 的底层结构依然是数组,所以操作的时候,不是操作slice的数据,而实际是操作底层数组的数据,所以得有指向该数组的指针,长度则表示当前slice的长度(非底层数组的长度),容量则表示从slice起始位置到底层数组的结束位置,注意此处是位置差,即表示能存放多少个元素。
slice 的用法和array类似,但申明时,不指定数组的长度,如 var s []int,slice 通过len(s),cap(s)查看s的长度和容量
测试下:
mainmain(){testArray=[]int{,,,,,,,,,}fmt.Println(testArray[:])fmt.Println(testArray[len(testArray)-])i,v:=testArray{fmt.Printf(,i,v)}s:=testArray[:]i1,v1:=s{fmt.Printf(,i1,v1)}fmt.Printf(,cap(s),len(s))}测试结果为:[0123]9001122334455667788990314253647thescap's7theslen's5slice倒序:packagemainimport"fmt"funcmain(){vartestArray[10]int=[10]int{0,1,2,3,4,5,6,7,8,9}fmt.Println(testArray[0:4])fmt.Println(testArray[len(testArray)-1])fori,v:=rangetestArray{fmt.Printf("%d%d\n",i,v)}s:=testArray[3:8]fori1,v1:=ranges{fmt.Printf("%d%d\n",i1,v1)}fmt.Printf("thescap's%d\ntheslen's%d\n",cap(s),len(s))//resersetheslicefmt.Println("beforereserse",s)reserse(s)fmt.Println("afterreserse",s)}funcreserse(s[]int){fori,j:=0,len(s)-1;i<j;i,j=i+1,j-1{//fori,j:=0,len(s)-1;i<j;i,j=i+1,j-1{s[i],s[j]=s[j],s[i]}}输出:。。。beforereserse[34567]afterreserse[76543]
检查slice是否为空的两种方式,直接和nil比较,还有一个是判断slice长度为空
testNil[]inttestNil==nil{fmt.Println()}len(testNil)=={fmt.Println()}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。