1. 程式人生 > >day03 Go slice操作

day03 Go slice操作

1、定義slice語法

你可以宣告一個未指定大小的陣列來定義切片:

var identifier []type

切片不需要說明長度。

或使用make()函式來建立切片:

var slice1 []type = make([]type, len)

//也可以簡寫為

slice1 := make([]type, len)

也可以指定容量,其中capacity為可選引數。

make([]T, length, capacity)

這裡 len 是陣列的長度並且也是切片的初始長度。

 

2、例項

package main

import "fmt"

func updateSlices(arr []int)  {
	arr[0] = 100
}

func printSlice(s []int)  {
	fmt.Printf("len=%d,cap=%d\n",len(s),cap(s))
}

func main()  {
	arr := [...]int{0,1,2,3,4,5,6,7}

	fmt.Println("arr[2:6] =",arr[2:6])
	fmt.Println("arr[:5] =",arr[:5])
	fmt.Println("arr[2:] =",arr[2:])
	fmt.Println("arr[:] =",arr[:])

	s1 := arr[2:]
	fmt.Println("s1 =",s1)
	s2 := arr[:]
	fmt.Println("s2 =",s2)

	// 修改s1,也修改了arr,slice本身沒有資料,而是對底層arry的一個view,修改slice的資料等於丟改底層的arry。
	fmt.Println("after update s1")
	updateSlices(s1)
	fmt.Println("s1 =",s1)
	fmt.Println("arr =",arr)

	// 修改s2,也修改了arr
	fmt.Println("after update s2")
	updateSlices(s2)
	fmt.Println("s2 =",s2)
	fmt.Println("arr =",arr)

	// 切片擴充套件
	fmt.Println("extending slice")
	arr1 := [...]int{0,1,2,3,4,5,6,7}
	s3 := arr1[2:6]
	s4 := s3[3:5]
	fmt.Printf("s3=%v,len(s3)=%d,cap(s3)=%d\n",s3,len(s3),cap(s3))
	fmt.Printf("s4=%v,len(s4)=%d,cap(s4)=%d\n",s4,len(s4),cap(s4))
	fmt.Println("s3 =",s3)
	fmt.Println("s4 =",s4)

	// 像slicet新增元素
	s5 := append(s4,10)
	fmt.Println("s5 =",s5)
	s6 := append(s5,11)
	fmt.Println("s6 =",s6)
	s7 := append(s6,12)
	fmt.Println("s7 =",s7)
	// 新增元素的時候,如果超越cap,此時go會新建一個更大的底層陣列來儲存新增的元素。slince 可以向後擴充套件,但是不能向前擴充套件,但是不能超過底層cap的長度。
	fmt.Println("arr1 =",arr1)

	//新增一個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 =",s)

	s8 := make([]int,16)
	s9 := make([]int,16,32)
	s10 := []int{1,2,3,4,5}

	printSlice(s8)
	printSlice(s9)
	printSlice(s10)
	fmt.Println(s8,s9,s10)

	// 複製slice
	copy(s9,s10)
	printSlice(s9)
	fmt.Println("s9 =",s9)

	// 刪除slice元素,刪除s9中的元素4
	s9 = append(s9[:3],s9[4:]...)
	fmt.Println("new s9 =",s9)

	// 刪除第一個元素
	s9 = s9[1:]
	fmt.Println("after delete header s9 =",s9)

	// 刪除最後一個元素
	s9 = s9[:len(s9) -1 ]
	fmt.Println("after delete last s9 =",s9)

}