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)

}

  

posted @ 2018-03-11 15:46  小白兔奶糖  阅读(182)  评论(0编辑  收藏  举报