(二)golang陣列和切片

傑克曼發表於2019-02-16

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個位置

切片詳解

http://www.jianshu.com/p/030a…

相關文章