go語言學習 四 陣列和切片

2021-10-04 19:26:37 字數 2886 閱讀 3773

在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 ...