1、陣列
golang中的陣列是一種由固定長度和固定物件型別所組成的資料型別。例如下面:
var a [4]int
a是一個擁有4個int型別元素的陣列。當a一旦被宣告之後,元素個數就被固定了下來,在a這個變數的生命週期之內,元素個數不會發生變化。而此時a的型別就是[4]int,如果同時存在一個b變數,為[5]int。即便兩個變數僅僅相差一個元素,那麼在記憶體中也佔據著完全不同的地址分配單元,a和b就是兩個完全不同的資料型別。在golang中,陣列一旦被定義了,那麼其內部的元素就完成了初始化。也就是時候a[0]等於0。
在golang當中,一個陣列就是一個資料實體物件。在golang當使用a時,就代表再使用a這個陣列。而在C中,當使用a時,則代表著這個陣列第一個元素的指標。
2、切片
letters := []string{"a", "b", "c", "d"}
陣列宣告時候方括號內需要寫明陣列的長度或者使用(…)符號自動計算長度,切片不需要指定陣列的長度。比較規範的宣告方式是使用make,大致有兩種方式
1、只指定長度,這個時候切片長度和容量相同;
2、同時指定切片的長度和容量。
var s1 = make([]byte, 5)
var s2 = make([]byte, 5, 10)
由於切片是 引用型別 ,因此當引用改變其中元素的值時候,其他的所有引用都會改變該值。例如
var a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a[:4]
s2 := a[3:7]
fmt.Println(s1)
fmt.Println(s2)
s1[3] = 100
fmt.Println(s1)
fmt.Println(s2)
結果是:
[1 2 3 4]
[4 5 6 7]
[1 2 3 100]
[100 5 6 7]
從概念上看,切片像是一個結構體,包含了三個元素:
1、一個指向陣列中切片指定的開始位置;
2、長度,即切片的長度,通過內建函式len獲得;
3、最大長度,即切片的最大容量,通過內建函式cap獲得。
如果len比cap還大,那麼就會觸發執行時異常。
golang提供append函式來新增元素,當使用append函式時,append函式會判斷目的切片是否具有剩餘空間,如果沒有剩餘空間,則會自動擴充兩倍空間。
golang提供copy用於將內容從一個陣列切片複製到另一個陣列切片。如果加入的兩個陣列切片不一樣大,就會按其中較小的那個陣列切片的元素個數進行復制。
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只會複製slice1的前3個元素到slice2中
copy(slice1, slice2) // 只會複製slice2的3個元素到slice1的前3個位置