go_切片
go语言中切片相当于array的一个view。
其底层实现如下
ptr指的是slice中打头的元素。
len表示slice的长度。
cap表示ptr到整个array的长度
slice可以向后扩展,但不能超过对应数组的长度,但是不能向前扩展
package main import "fmt" //[]int不加长度表示slice func updateSlice(s []int) { s[0] = 100 } func main() { arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s1 := arr[2:6] //左闭右开,arr[:]这种结构表示切片 s2 := arr[:6] s3 := arr[2:] s4 := arr[:] fmt.Println(s1, s2, s3, s4) updateSlice(s3) fmt.Println(s3) updateSlice(s4) fmt.Println(s4) fmt.Println(arr) fmt.Println("reslice") //slice上还可以继续建立slice fmt.Println(s3) s3 = s3[:3] fmt.Println(s3) s3 = s3[2:] fmt.Println(s3) fmt.Println("Extending slice") arr[0], arr[2] = 0, 2 s11 := arr[2:6] s12 := s11[3:5] fmt.Printf("s11=%v,len(s11)=%d,cap(s11)=%d\n", s11, len(s11), cap(s11)) fmt.Printf("s12=%v,len(s12)=%d,cap(s12)=%d\n", s12, len(s12), cap(s12)) fmt.Println(" ") s13 := append(s12, 10) s14 := append(s13, 11) s15 := append(s14, 12) fmt.Println("s13,s14,s15", s13, s14, s15) fmt.Println("arr=", arr) //往一个数组中添加数据,可以先把数组变成arr[:]切片,然后再用append()函数往尾部添加值 }
slice的操作
package main import "fmt" func printSlice(s []int){ fmt.Printf("%v,len=%d,cap=%d\n",s,len(s),cap(s))//每当装不下的时候就乘2扩充cap } func main() { fmt.Println("创建slice") var s []int//Zero value for slice is nil for i:=0;i<100;i++{ printSlice(s) s = append(s , 2 * i + 1) } fmt.Println(s) //其他创建slice的方法 s1 :=[]int{2,4,6,8}//给slice初始一些值 printSlice(s1) s2 :=make([]int ,16)//创建一个len为16的slice s3 :=make([]int ,16,32)//创建一个len为16,cap为32的slice printSlice(s2) printSlice(s3) fmt.Println("复制切片") copy(s2,s1) printSlice(s2) fmt.Println("删除切片中的元素") s2=append(s2[:3],s2[4:]...) printSlice(s2) fmt.Println("拿到头") front:=s2[0] s2 =s2[1:] fmt.Println(front) printSlice(s2) fmt.Println("拿到尾") tail:=s2[len(s2)-1] s2 =s2[:len(s2)-1] fmt.Println(tail) printSlice(s2) }