1. 程式人生 > >Go 3 數組、切片、函數

Go 3 數組、切片、函數

遍歷 image update copy 調整 pri height bool eight

數組

數組是值類型:必須規定數組長度 [ ]int是切片 [5]int是一個數組

註意:數組的大小是類型的一部分。因此[5]int和[25]int是不同的類型。因此,數組不能被調整大小。切片解決此問題

a := [3]int{5, 78, 8}
var b [5]int b = a //not possible since [3]int and [5]int are distinct types
數組被分配給一個新變量時,將把原始數組的副本分配給新變量。
如果對新變量進行了更改,則不會在原始數組中反映。

值傳遞與參數傳遞(引用)
值傳遞:拷貝
引用傳遞:不是

 技術分享圖片

Go語言中一般不直接使用數組

聲明

var array1 [5]int
array2 := [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 數組、切片、函數