1. 程式人生 > 其它 >【筆記】go語言--(Slice)切片的概念

【筆記】go語言--(Slice)切片的概念

go--(Slice)切片的概念

//切片是什麼,定義一個arr,定義一個s為arr中的2到6,這個s就是一個切片
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]//半開半閉區間,值為[2 3 4 5]
//下面的都是Slice
fmt.Println("arr[2:6]=", arr[2:6])//[2 3 4 5]
fmt.Println("arr[:6]=", arr[:6])//[0 1 2 3 4 5]
fmt.Println("arr[2:]=", arr[2:])//[2 3 4 5 6 7]
fmt.Println("arr[:]=", arr[:])//[0 1 2 3 4 5 6 7]

Slice實際上是array的一個view,是一個檢視,對資料進行改動的時候,原始資料也會進行改變,在Slice上面還可以建Slice

//Slice本身沒有資料,是對底層array的一個view
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]
s [0] = 10//arr的值變為[0 1 10 3 4 5 6 7]

Slice的層疊

//在Slice上面還可以建Slice
s :=arr[2:6]
s = s[:3]
s = s[1:]
s = arr[:]

Slice的擴充套件

//Slice的擴充套件

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

s1 := arr[2:6]//正常取值[2 3 4 5]

s2 := s1[3:5]//一樣可以取到值[5 6]

原因:Slice的可擴充套件性,在arr中的陣列中的數值,s1進行取值的時候是進行下標的對比,實際上的在s1的下標中,4和5是對應arr中的6和7的,只不過沒有顯示出來,在s2取值的時候也是進行s2的下標對比,所以就取到了隱藏的下標的對應的值(感覺越說越亂)

Slice可以向後擴充套件,但是不能向前擴充套件

Slice的實現

底層就是array,ptr是指向陣列中值的位置,len是slice檢視的資料,cap是底層陣列的長度

需要注意,s[i]不可以超越len(s),向後擴充套件不可以超越底層陣列cap(s)

//顯示
arr = [...]int{0,1,2,3,4,5,6,7}
s1 = arr[2:6]
s2= s1[3:5]
fmt.PrintIn(s1[:cap(s1)])
fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d",s1, len(s1), cap(s1))
fmt.PrintIn("\n")
fmt.PrintIn(s2[:cap(s2)])
fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d",s2, len(s2), cap(s2))
fmt.Println("\n")
您能讀到這兒,我呢是發自真心的感謝您,若要轉載,還望請您帶上鍊接