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))}测试结果为:[0 1 2 3]90 01 12 23 34 45 56 67 78 89 90 31 42 53 64 7the s cap's 7the s len's 5slice 倒序:package mainimport "fmt"func main(){ var testArray [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]) for i,v:=range testArray { fmt.Printf("%d %d\n",i,v) } s:=testArray[3:8] for i1,v1:=range s{ fmt.Printf("%d %d\n",i1,v1) } fmt.Printf("the s cap's %d\nthe s len's %d\n",cap(s),len(s)) // reserse the slice fmt.Println("before reserse ",s) reserse(s) fmt.Println("after reserse",s)}func reserse(s []int){ for i,j:=0,len(s)-1;i<j;i,j = i+1,j-1 { //for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i],s[j]=s[j],s[i] }}输出:。。。before reserse [3 4 5 6 7]after reserse [7 6 5 4 3]
检查slice是否为空的两种方式,直接和nil比较,还有一个是判断slice长度为空
testNil []inttestNil==nil { fmt.Println()}len(testNil)=={ fmt.Println()}