golang 基礎(fourteen)slice

square-gopher.png
(slice)切片

slice.png
slice是動態地表述陣列的片段
每一個 slice 都包含一個指向陣列的片段的指標 ptr ,一個 len 用於表示陣列片段的長度以及 cap 表示片段可擴充套件能力。

slice_illustration.JPG
- s := []int{3,4,5} 有初始化值的初始化
- s := []int{} 沒有初始值的初始化,分配記憶體
- s := []int 宣告一個 slice ,且暫不分配記憶體
這樣宣告好處當一個slice在隨後可能不被使用,所以暫時不分配記憶體給他。 - s := make([]int,5,10) 沒有初始值的 slice 初始化,分配記憶體指定 slice 長度並且指定陣列的承載能力
func main(){ arr := [...]int{0,1,2,3,4,5,6,7} s := arr[2:6] //[2 3 4 5] fmt.Println(s) }
s 就可以理解為陣列 arr 的切片,在計算機中通常擷取是半開半閉原則所以 2 是被包含進去而 6 不被包含。
fmt.Println("arr[2:6] = ",arr[2:6]) fmt.Println(arr[2:]) fmt.Println(arr[:6]) fmt.Println(arr[:])
結果自己嘗試吧
slice 的長度和可擴充套件
s := arr[2:6] fmt.Println(cap(s)) //6 fmt.Println(len(s)) //4
長度就不解釋,擴充套件是就是 arr 在 slice 後面還剩幾個元素就是 slice 幾位可擴充套件。
還可以對 slice 進行取 slice
s = s[:3] fmt.Println(s) //[2 3 4] s = s[2:]//[4] fmt.Println(s)
那麼可以進一步研究一下下面的程式碼,看一看擴充套件的用途,這裡注意一下 s1 從 s 中進行取值,取值範圍已經超出的 s 的長度,但是因為沒有超出其擴充套件,所以 s1 會從陣列 arr 進行取值。
s := arr[2:6] fmt.Println(cap(s)) //6 fmt.Println(len(s)) //4 s1 := s[3:5] fmt.Println("s = ",s) fmt.Println("s1 = ",s1)
s =[2 3 4 5] s1 =[5 6]

slice_extension.JPG

slice_extension_02.JPG
- s 的值為[2,3,4,5], s2 的值為[5,6]
- slice 可以向後擴充套件,不可以向前擴充套件
- s[i]不可以超越len(s),向後擴充套件不可以超越底層陣列cap(s)