在go語言中,陣列和切片都是集合型別,他們都是用來儲存同一種型別的元素。
1.陣列型別的長度是固定的,而切片型別的長度是可變長的。如下面**宣告乙個長度為5的陣列s1和長度為5的切片s2,
s1 := [5]int
s2 := int
但是s1是不可變的,而s2是可變的,可以增加元素,長度隨著元素數量而增長。因此陣列是乙個值型別,而切片是乙個引用型別。
2.切片的底層是乙個陣列,如下面**:s3是s4的底層陣列,
s3 := int
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]
因為切片s4取值從陣列s3的下標4開始到下標6(不包含),所以長度是3,容量是5
3.切片是可以擴容的,往切片中增加元素時,當切片容量不夠時,切片會進行擴容。
如果擴容前切片容量小於1024,那擴充套件為原容量的2倍。
如果擴容前切片容量大於等於1024,那擴充套件為原容量的1.25倍,如果還不夠,會再次擴充套件為原來的1.25倍。
如果追加元素太多,擴充套件為2倍還不夠,會直接擴充套件為新的長度。
// 示例1。
s6 := make(int, 0)
fmt.printf("the capacity of s6: %d\n", cap(s6))
for i := 1; i <= 5; i++
fmt.println()
// 示例2。
s7 := make(int, 1024)
fmt.printf("the capacity of s7: %d\n", cap(s7))
fmt.printf("s7e1: len: %d, cap: %d\n", len(s7e1), cap(s7e1))
fmt.printf("s7e2: len: %d, cap: %d\n", len(s7e2), cap(s7e2))
fmt.printf("s7e3: len: %d, cap: %d\n", len(s7e3), cap(s7e3))
fmt.println()
// 示例3。
s8 := make(int, 10)
fmt.printf("the capacity of s8: %d\n", cap(s8))
fmt.printf("s8a: len: %d, cap: %d\n", len(s8a), cap(s8a))
fmt.printf("s8b: len: %d, cap: %d\n", len(s8b), cap(s8b))
fmt.printf("s8c: len: %d, cap: %d\n", len(s8c), cap(s8c))
上面**的輸出如下:
the capacity of s6: 0
s6(1): len: 1, cap: 1
s6(2): len: 2, cap: 2
s6(3): len: 3, cap: 4
s6(4): len: 4, cap: 4
s6(5): len: 5, cap: 8
the capacity of s7: 1024
s7e1: len: 1224, cap: 1280
s7e2: len: 1424, cap: 1696
s7e3: len: 1624, cap: 2048
the capacity of s8: 10
s8a: len: 21, cap: 22
s8b: len: 44, cap: 44
s8c: len: 89, cap: 96
因為作業系統記憶體對齊的原因,擴容後的切片並不能恰好成為原切片的2倍或1.25倍
4.當切片擴容時,原切片和底層資料並沒有被替換,而且生成了乙個新的底層陣列和切片。
// 示例1。
a1 := [7]int
fmt.printf("a1: %v (len: %d, cap: %d)\n",
a1, len(a1), cap(a1))
s9 := a1[1:4]
//s9[0] = 1
fmt.printf("s9: %v (len: %d, cap: %d)\n",
s9, len(s9), cap(s9))
for i := 1; i <= 5; i++
fmt.printf("a1: %v (len: %d, cap: %d)\n",
a1, len(a1), cap(a1))
fmt.println()
上面**輸出:
a1: [1 2 3 4 5 6 7] (len: 7, cap: 7)
s9: [2 3 4] (len: 3, cap: 6)
s9(1): [2 3 4 1] (len: 4, cap: 6)
s9(2): [2 3 4 1 2] (len: 5, cap: 6)
s9(3): [2 3 4 1 2 3] (len: 6, cap: 6)
s9(4): [2 3 4 1 2 3 4] (len: 7, cap: 12)
s9(5): [2 3 4 1 2 3 4 5] (len: 8, cap: 12)
a1: [1 2 3 4 1 2 3] (len: 7, cap: 7)
參考:極客時間
go語言學習 陣列 切片 map
go語言中陣列的特點 陣列的長度是固定的,並且長度也是陣列型別的一部分 是值型別,在賦值或者作為引數傳遞時,會複製整個陣列,而不是指標 定義陣列的語法 var arr1 5 int 5 int 未初始化的值,就預設初始化為該型別的預設值 var arr2 int 3 int 長度可由初始化的元素個數...
GO語言學習 切片
切片的長度可以用len獲得,容量由cap獲得.s1 make int,5 len s1 可以得到長度為5,cap s1 可以得到容量為5 s2 make int,5,8 len s2 可以得到長度為5,cap s2 可以得到容量為8 在s1中我沒有用make說明此切片的容量,因此他的容量和長度相等都...
go語言學習總結之陣列和切片
1 陣列在初始化的時候,需要指定大小,若不指定則會進行自動推算,而且陣列大小是不可變的。2 陣列在作為函式的入參時,需要明確指定陣列大小,並且傳遞方式是值傳遞。示例 陣列宣告和初始化 a int 這裡需要注意,如果這樣宣告 a int 則a為切片不是陣列 b 5 int 作為函式函式傳入 func ...