---
# System prepended metadata

title: 'Day 9 : Golang array'
tags: [About Go]

---

# 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)。

![](https://i.imgur.com/8hF0Kqu.png)
(圖一，自行繪製)




## 實作
接下來透過不同的宣告方式操作一些常用的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`