# 數組與切片
* * * * *
--: 作者:Mick
時間:2018年9月1日
* * * * *
:-: **數組**
* * * * *
#### 數組的定義
數組是一個長度固定類型一致的值數據類型
#### 數組的聲明
第一種 Var關鍵字聲明0值初始化
var arr [n]type // n表示數組的長度無符號整形或 ... ,type表示存儲任意類型的元素
var arr [10]int // 聲明了一個int類型的數組,全部0填充
arr[0] = 42 // 數組下標是從0開始的
arr[1] = 13 // 賦值操作
* * * * *
第二種 數組字面量聲明并初始化
arr1 := [5]int{1,2,3} // 最常用
arr2 := [...]int{1,2,3} // 可以省略長度而采用`...`的方式,自動計算填充
arr3 := [...]int{100:100} //索引為99的值是100,其余值是默認值0
arr4 := *[3]int{1,2,3} //指針數組共享值
arr5 := [2][4]int{{1,2,3,4},{5,6,7,8}} //二維數組,2行3列

#### 數組的遍歷
func main(){
arr1 := [5]int{0:0,1:1,2:2}
PrintPArr(arr1)
fmt.Println(arr1)
}
func PrintPArr(arr1 [5]int){
for k,v := range arr1{
fmt.Println(k," => ",v)
arr1[k] = k
}
}
//思考值數組 arr1 [5]int 換成 指針數組arr1 *[5]int
#### 數組的總結
長度是數組類型的一部分[1]int 與 [2]int 是不同類型
數組是值拷貝 func printValue(arr [5]int) 與 func printValue(arr *[5]int)
**問題1:如果我不知道數組的長度怎們辦
問題2:如果我想改變數組的長度怎么辦**
:-: **切片**
* * * * *
#### 切片的定義
切片是一個長度不定類型一致的引用數據類型,底層指向數組的第一個元素
可以按需自動增長和縮小,slice總是指向一個底層array
#### 切片的聲明
第一種 Var關鍵字聲明0值初始化
var s []type // 中括號為空,type表示存儲任意類型的元素
var s []int // 和聲明array一樣,只是少了長度
s[0] = 0 // 索引從0開始
* * * * *
第二種 切片字面量聲明并初始化
s1 := []byte {'a', 'b', 'c', 'd'}
* * * * *
第3種 使用make函數創建
s := make([]int,10) // []int 表示創建的類型,10 表示容量
* * * * *
#### 切片結構
* * * * *

* * * * *
// 從array 或 slice 中獲取 slice
array[i,j] // i 開始索引 , j 結束索引 , 范圍 [i,j)
* 省略開始索引 ar[:n] =》 ar[0:n]
* 省略結束索引 ar[n:] =》 ar[n:len(ar)]
* 省略前后索引 ar[:] =》ar[0:len(ar)]
* append函數用于切片末尾追加
* len計算切片的長度
* cap計算切片的容量
slice := []int{10,20,30,40,50} // len=4, cap=4
newSlice := slice[1:3]
newSlice = append(newSlice,60)
fmt.Println (slice,newSlice)
fmt.Println(len(slice),cap(newSlice))
* * * * *
思考題
* 什么是切片的長度, 怎么計算
* 什么是切片的容量,怎么計算
slice對應數組的信息,i 起始位置, j 結束位置, k 數組長度
len 獲取slice的長度, j - i
cap 獲取slice的最大容量, k - i
* * * * *
思考題
* 切片如何擴容,怎么追加或刪除元素
* 切片的長度與容量計算方式
* * * * *

#### 切片擴容深入
1: 什么時候回擴容
append 向slice里面追加一個或者多個元素的時候
* 如果 len(切片長度) > cap(原有的容量) 則切片會進行擴容
* 此切片的底層數據會copy原有的數組,然后進行追加,不影響原有的數組
2: 擴容的規則
* 元素個數 <= 1024 ,容量是2倍增長
* 元素個數 > 1024 , 容量是1.25倍增長
slice := []int{10,20,30,40} // len=5, cap=5
newSlice := append(slice,50)
fmt.Println(slice,newSlice)
#### 舉例驗證
* 數組是值類型
* 切片是引用類型