golang中的數組是一種由固定長度和固定對象類型所組成的數據類型。例以下面: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時,則表明着這個數組第一個元素的指針。數組
letters := []string{"a", "b", "c", "d"}
數組聲明時候方括號內須要寫明數組的長度或者使用(...)符號自動計算長度,切片不須要指定數組的長度。比較規範的聲明方式是使用make,大體有兩種方式app
一、只指定長度,這個時候切片長度和容量相同;函數
二、同時指定切片的長度和容量。指針
var s1 = make([]byte, 5) var s2 = make([]byte, 5, 10)
因爲切片是 引用類型 ,所以當引用改變其中元素的值時候,其餘的全部引用都會改變該值。例如code
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]get
[100 5 6 7]
從概念上看,切片像是一個結構體,包含了三個元素:
一、一個指向數組中切片指定的開始位置;
二、長度,即切片的長度,經過內置函數len得到;
三、最大長度,即切片的最大容量,經過內置函數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個位置