go陣列與切片
阿新 • • 發佈:2018-11-08
陣列
陣列是具有相同唯一型別的一組長度固定的資料項序列,這種型別可以是任意的原始型別,例如整形,字元型或者自定義型別。陣列長度必須是一個常量的表示式,並且是一個非負整數。 陣列元素可以用個索引累讀取,陣列長度最大為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,3
var slice2 = [:] //1,2,3,4,5
var slice3 = [1:] // 2,3,4,5
var slice4 = [:2] // 1,2,3
複製程式碼
切片可以使用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} // 追加
複製程式碼
微信搜尋「goentry-xyz」,關注公眾號「燈下獨碼」