GO語言中的切片

1.切片聲明及創建

聲明一個切片int型的切片

var s []int

初始化一個長度爲len,容量爲cap的切片

s = make([]int,len,cap) cap可以省略,省略後cap等於len

也可以簡潔的初始化

s:=make([]int ,len,cap)

還可以指定值的創建切片

s:=[]int{1,2,3,4}

指定索引值式的創建

s:=[]int{3:5} 索引下標爲3的值爲5

2.切片的相關操作

數組是值類型,切片和數組不一樣,切片是引用類型,如果不想改變原來的切片進行操作,可以使用copy(新切片,原切片)複製一份。切片在底層是數組,包含三部分,ptr爲指向開始的元素,len爲切片的長度,cap爲切片的容量。s[1:4]會得到索引爲1,2,3的值,腳標是前包括,後不包括。切片可以向後擴展,不可以向前擴展,s[i]不可以超越len(s),向後擴展不可以超越底層數組cap(s)。

例子1:

func update(s []int,val int)  {
	s[0] = val
}

func main(){
	var total = [...]int{0,1,2,3,4,5,6,7}
	s1:=total[:]
	fmt.Println("change before")
	fmt.Println(s1)
	update(s1,100)
	fmt.Println("change after")
	fmt.Println(s1)
}

以上會輸出

change before
[0 1 2 3 4 5 6 7]
change after
[100 1 2 3 4 5 6 7]

例子2:以下會輸出什麼?

func main(){
	var total = [...]int{0,1,2,3,4,5,6,7}
	var s1 []int
	s1=total[2:6]
	fmt.Printf("s1 len=%d,cap=%d\n",len(s1),cap(s1))
	s2:=s1[2:5]
	fmt.Printf("s2 len=%d,cap=%d\n",len(s2),cap(s2))
	fmt.Println(total)
	fmt.Println(s1)
	fmt.Println(s2)
}

輸出以下內容

s1 len=4,cap=6
s2 len=3,cap=4
[0 1 2 3 4 5 6 7]
[2 3 4 5]
[4 5 6]

畫圖看一下

這個就涉及到切片的向後擴展, s2的末索引超過s1的末索引時而不會報錯。s1和s2都指向底層的total數組。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章