go陣列與切片

旱鴨子發表於2018-11-05

陣列

陣列是具有相同唯一型別的一組長度固定的資料項序列,這種型別可以是任意的原始型別,例如整形,字元型或者自定義型別。陣列長度必須是一個常量的表示式,並且是一個非負整數。 陣列元素可以用個索引累讀取,陣列長度最大為2Gb。宣告格式為:

var identifier [len]type
複製程式碼

例如:

var arr1 [5]int
複製程式碼

每個元素是一個整型值,陣列在宣告時所有的元素都會被自動初始化為0. 由於索引的存在,遍歷陣列可以使用for或者for-range。 例子:

var arr1 [5]int
for i := 0; i < len(arr1); i++ {
    arr1[i] = i * 2
}
for i, val := range arr1 {
    fmt.Printf("index = %d, value = %d",i, val)
}

//輸出
index = 0, value = 0
index = 1, value = 2
index = 2, value = 4
index = 3, value = 6
index = 4, value = 8
複製程式碼

go中陣列是一種值型別,所以可以通過new()來建立:

var arr1 = new([5]int)
複製程式碼

new建立的陣列型別為*[5]int,這種跟var arr2 [5]int的區別就在於此。

陣列還可以直接使用常量進行初始化:

var a = [3]int{1,2,3}
var b = [...]int{1,2,3,4,5}
var c = [5]int{1,2,3} // 前三位有值,後兩位為0
var d = [2]string{"1","2"}
var e = [4]string{1: "1", 2: "2"} //索引1,2倍賦值,其餘的為空字串
複製程式碼

陣列還可以組成多為陣列,比如[2][3]int之類的。 陣列也可以當初函式引數來進行傳遞,但是對於陣列較大的會消耗很多記憶體。所以一般時候,要不傳遞一個指標陣列,要不就只傳遞一個切片。

切片

切片slice是對陣列一個連續片段的引用,所以說切片是一個引用型別。這個切片可以是整個陣列,或者是陣列的一部分。 切片的格式宣告為:

var identifier []type //不需要宣告長度
複製程式碼

切片未初始化之前預設為nil,長度為0.切片的初始化格式為:

var slice1 []type = arr1[start:end]
複製程式碼

例子:

var arr1 = [5]int{1,2,3,4,5}
var slice1 = [1, 2] //2
var slice2 = [:] //1,2,3,4,5
var slice3 = [1:] // 2,3,4,5
var slice4 = [:2] // 1,2
複製程式碼

切片可以使用make()來建立

var slice1 []type = make([]type, len)
// or
slice2 := make([]type, len)
複製程式碼

len是切片的長度。 切片還支援複製和追加,使用copy關鍵字進行切片的複製,append進行追加:

a := []int{1, 2, 3}
b := make([]int, 10}

n := copy(b, a) // 長度長的被覆蓋

c := []int{4, 5, 6}
c = append(c, 7, 8, 9} // 追加
複製程式碼

go陣列與切片

微信搜尋「goentry-xyz」,關注公眾號「燈下獨碼」

相關文章