# Day 9 : Golang array
<style>
.important{
color:red
}
</style>
## 前言
當我們儲存一堆相同類型的資料,在JavaScript中可能會用Array,,在Python中會用到list,在Golang裡面則可能用到array, slice和map這三種集合(collection types),接下來幾天也會複習如何用這三種方式組織資料。
## Array
Array是由<span class='important'>固定大小</span>且<span class='important'>相同型別</span>元素所組成的集合,在一開始定義的時候就需要定義**長度**和**型別**。以下面圖一為例,透過var a = [5]int{10,30,57,32,77}進行宣告變數與初始化,其長度為5,資料型別為int,此外在初始化完後,亦可以透過使用`index`來**存取**裡面的元素(注意這是存取,如果是要新增或是修改應該要使用slice)。

(圖一,自行繪製)
## 實作
接下來透過不同的宣告方式操作一些常用的array儲存的資料。
如果不想定義初始化的值,可以在長度的地方寫成`...`三個點,這樣會根據初始化的值自動形成該長度的陣列,如下面的a會形成長度為7的array。
a2則是在索引9定義為1,前面index0~8因為沒有定義,會形成zero value,故長度為10
```go=
func main() {
var a =[...]int{1,2,77,4,23,6,89}
fmt.Printf("長度為 : %v",len(a)) // 長度為 : 7
var a2 =[...]int{9:1}
fmt.Printf("長度為 : %v",len(a2)) // 長度為 : 10
fmt.Println(a2) // [0 0 0 0 0 0 0 0 0 1]
}
```
當我們宣告變數,但沒有進行初始化賦值的時候,長度的地方就不可以寫成`...`,必須給定一固定數字,並透過索引進行賦值,如沒有賦值會呈現該型別的zero value。
```go=
func main() {
var a =[5]int{}
a[0]=5
a[2]=7
fmt.Println(a) // [5 0 7 0 0]
}
```
當然我們也可以利用迴圈來iterate array,在Go裡面只有for迴圈,沒有while迴圈,在此透過兩種for迴圈的方式進行iterate。
```go=
func main() {
a :=[...]int{5,6,7,8}
for i:=0 ; i <len(a); i++{
a[i] *= a[i]
fmt.Printf("index %v becomes %v \n",i,a[i])
}
for i, val := range a {
a[i] = val * val
fmt.Printf("index %v becomes %v \n", i, a[i])
}
}
//index 0 becomes 25
//index 1 becomes 36
//index 2 becomes 49
//index 3 becomes 64
//index 0 becomes 625
//index 1 becomes 1296
//index 2 becomes 2401
//index 3 becomes 4096
```
array的長度在一開始宣告如果不是用`...`也不是直接寫數字,就必須要用常數固定
```go=
func main(){
const length int =5 // 可以執行
// length := 5 // 不可以執行,因為是變數
a := [length]int{1, 56, 78, 98, 100}
for _, v := range a{
fmt.Printf("%v ", v)
}
}
```
建立多維陣列,就像一維一樣,如果沒有定義就是呈現zero value
```go=
func main(){
a := [4][5]float64{
{1,3},
{5,10,15,20,25},
{-1,2.3,9.6,7.7},
}
fmt.Println(a) //[[1 3 0 0 0] [5 10 15 20 25] [-1 2.3 9.6 7.7 0] [0 0 0 0 0]]
}
```
## References
1. https://ithelp.ithome.com.tw/articles/10234744
2. https://calvertyang.github.io/2019/11/12/working-with-arrays-in-golang/
###### tags: `About Go`