標籤:預設 ssi upd reslice ice 副本 oss enc 傳統
數組
數組是實值型別:必須規定數組長度 [ ]int是切片 [5]int是一個數組
注意:數組的大小是類型的一部分。因此[5]int和[25]int是不同的類型。因此,數組不能被調整大小。切片解決此問題
a := [3]int{5, 78, 8}
var b [5]intb = a //not possible since [3]int and [5]int are distinct types
數組被分配給一個新變數時,將把原始數組的副本分配給新變數。如果對新變數進行了更改,則不會在原始數組中反映。值傳遞與參數傳遞(引用)值傳遞:拷貝引用傳遞:不是
Go語言中一般不直接使用數組
聲明
var array1 [5]intarray2 := [3]int{1,2,3}array3 := [...]int{1,2,3}var grid [4][5] bool
長度
通過將數組作為參數傳遞給len函數,可以獲得數組的長度。
遍曆數組:傳統
a := [...]float64{67.7, 89.8, 21, 78} for i := 0; i < len(a); i++ { //looping from 0 to the length of the array fmt.Printf("%d th element of a is %.2f\n", i, a[i]) }
遍曆數組:range
for _,v := range arr3 { fmt.Println(v) }for i,v := range arr3 { fmt.Println(i,v) }for i := range arr3 { fmt.Println(arr3[i]) }
註:任何地方都可通過_省略變數
多維陣列
var threedim [5][10][4]int
切片
切片與數組相比,不需要設定長度,在[]中不用設定值,相對來說比較自由。
概念:
從概念上面來說slice像一個結構體,這個結構體包含了三個元素:指標,指向數組中slice指定的開始位置長度,即slice的長度最大長度,也就是slice開始位置到數組的最後位置的長度
slice本身沒有資料,是對底層array的一個view對slice所做的任何修改都將反映在底層數組中。
一個切片在未初始化之前預設為 nil,長度為 0
文法
定義:
arr := [...]int{0,1,2,3,4,5,6}
s := arr[2,6]
updateSlice:s1 :=arr[2:] s2 := arr[:]
Reslice: s := arr[2:6] s = s[:3] s = s[1:] s = arr[:]
添加元素:s = append(s,val) 如果超越cap,系統會重新分配更大的底層數組
由於值傳遞關係,必須接收append傳回值 如果len大了,cap開始是32,後64,再128
append()
append 向slice裡面追加一個或者多個元素,然後返回一個和slice一樣類型的slice
append函數會改變slice所引用的數組的內容,從而影響到引用同一數組的其它slice。 但當slice中沒有剩 餘空間(即(cap-len) == 0)時,此時將動態分配新的數組空間。
返回的slice數組指標將指向這個空間,而原 數組的內容將保持不變;其它引用此數組的slice則不受影響
copy()
copy 函數copy從源slice的src中複製元素到目標dst,並且返回複製的元素的個數
Go 3 數組、切片、函數