都屬於集合類的型別,它們的值用來儲存某一型別的值。
本質上來說,我們可以把切片看做是對陣列的一層簡單的封裝,每個切片的底層資料結構都是陣列,它可以看作是對陣列某個連續片段的引用,這裡需要注意的幾點是:
我們可以通過切片字面量表示式int
和內建make函式make(int,5,6)
初始化乙個切片,也可以通過切片表示式基於某個陣列或切片生成新切片,接下來分別描述下這幾種場景:
func main
() fmt.printf("slice length: %d\n", len(s))
fmt.printf("slice cap: %d\n", cap(s))
}// 輸出
// slice length: 6
// slice cap: 6
複製**
通過這種方式初始化的切片其長度和容量都等於初始化時傳入的元素數量。
func main
() // 輸出
// s1 length: 5
// s1 cap: 5
// s1 length: 5
// s1 cap: 6
複製**
內建函式make接收三個引數,第乙個引數為切片的型別字面量,第二個變數為切片的長度,第三個變數為切片的容量。當不指明切片容量的時,切片的容量就會和長度一致。
這裡可以把切片看成乙個視窗,通過這個視窗可以看到底層的陣列,視窗被劃分成乙個乙個的小格仔,每個格仔代表乙個陣列元素,但因為視窗大小有限因此不能看到陣列中所有的元素,大部分時候只能看到陣列連續的一部分元素。
當我們通過make函式或切片值字面量初始化的切片,它的第乙個元素總是會對應其底層陣列的第乙個元素,在這種情況下,切片的容量就等於其底層陣列的長度。拿s2為例,視窗最左邊的格仔對應的正好是其底層陣列索引為0的第乙個元素,因此,s2中索引從0到4的元素為其底層陣列中索引從0到4代表的那5個元素。
func main
() s4 := s3[3:6]
fmt.printf("the length of s4:%d\n", len(s4))
fmt.printf("the capacity of s4:%d\n", cap(s4))
fmt.printf("the value of s4:%d\n", s4)
}// 輸出
// the length of s4:3
// the capacity of s4:5
// the value of s4:[4 5 6]
複製**
在這裡需要明白s3[3:6]
切片表示式中方括號兩個整數其實就是數學中的區間表示法,其中3為起始索引,6為終止索引,代表s4從s3中索引為3的元素開始到索引為5的元素結束(不包含6),s4的長度就是6-3=3。因此我們可以說s4中的索引從0到2指向的元素對應的是s3中索引從3到5的那3個元素。
再來看看容量,乙個切片的容量可以看做為通過這個視窗最多可以看到的底層陣列重元素的個數。由於s4是在s3的基礎上通過切片操作得來的,所以s4的底層陣列就是s3的底層陣列,因此s4可以向右擴充套件直至陣列末尾,它的容量就是其底層陣列的長度8減去s3的起始索引3,即5。
注意這裡切片是無法向左擴充套件的,因此是永遠無法透過s4的視窗看到s3的前三個元素的。
若要將s4的視窗向右擴充套件到最大,可以通過切片表示式s4[0,cap(s4)]做到,它的結果值為int
func main
() s6 := s5[0:2]
fmt.printf("the value of s6:%d\n", s6)
fmt.printf("the value of s5:%d\n", s5)
}// 輸出
// the value of s6:[1 2 66]
// the value of s5:[1 2 66 4 5 6]
複製**
詳細介紹Go語言之陣列與切片
目錄 陣列是同一型別元素的集合,可以放多個值,但是型別一致,記憶體中連續儲存 go 語言中不允許混合不同型別的元素,而且陣列的大小,在定義階段就確定了,不能更改 定義乙個大小為3的string型別和int8型別的陣列,裡面可以放3個字串和3個數字 var names 3 string var age...
go語言之切片
go語言陣列和切片的異同 go 語言切片是對陣列的抽象。go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。下面看具體例項 package main impor...
go語言之陣列
陣列是go語言程式設計中最常用的資料結構之一,陣列中的每個資料被稱為陣列元素,乙個陣列中元素的個數被稱為陣列的長度。陣列的宣告方法 var arr 32 int 宣告乙個長度為32的陣列,陣列中的元素為int var arr 12 int 宣告乙個長度為12的陣列,陣列中的元素為 int var a...