Hike News
Hike News

Go初識-day10-陣列(Array)

introduction

定義:有固定長度且裏頭的每個元素都為同一種數據類型之序列

  • 陣列屬於值類型
  • 長度陣列類型的一部分,不同長度的陣列即使內部元素類型相同,仍為不同類型
    例如:

    1
    2
    var a [5]int
    var b [10]int

    a,b兩變量為不同類型,因此也不能比較

  • 陣列的index皆為0開始,最後一個元素的index為len-1

  • 如果訪問的index在陣列合法範圍之外,會觸發訪問越界,丟出panic

聲明

1
var variable_name [len]type
  • []中的數字為陣列的長度,確定後就無法修改
  • []後指定陣列中儲存哪種數據類型(type)
  • 聲明時默認每個元素都會初始化成0、空字符串、false

比如

1
2
var a [5]int
var b [10]string


初始化

1
var 變量名 [長度]類型 = [長度]類型{元素...}
1
2
3
4
5
6
7
8
9
var array [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}

var array [5]int = [5]int{1,2,3} //[1]

var array = [4]int{1,2,3} //[2]

var array = [...]int{1,2,3,4,} //[3]

var array = [5]string{3:"Hello",2:"100"} //[4]

[1] 如果未填滿陣列長度對應的值,會自動將未填入位置填入0
[2] 聲明的部分可不寫類型,Go會自動做類型推導
[3] 如果陣列太長不得而知長度又懶得數,可用...代替長度,編譯器會自動數

  • 但是初始化時後面跟了多少元素,便為其長度,不得修改

[4] 可直接指定下標初始化,元素欄裡的格式為{index:值} (重要)

  • 其他未初始化的值會初始化為0,空字符串,或是false…等

元素賦值

訪問index賦值

1
變量名[index] = 值
1
2
3
4
var array [10]int
array[0] = 1
array[1] = 2
array[9] = 9
  • 須注意index必須小於陣列的長度

遍歷陣列

使用for循環遍歷陣列

訪問index遍歷

1
2
3
4
var array [3]int = [3]int{1,2,3}
for i:=0;i<len(array);i++ {
fmt.Printf("array[%d]=%d\n",i,array[i])
}

result

1
2
3
array[0]=1
array[1]=2
array[2]=3

使用range遍歷

1
2
3
4
var array [3]int = [3]int{1,2,3}
for i,v := range array {
fmt.Printf("array[%d]=%d\n",i,v)
}

result

1
2
3
array[0]=1
array[1]=2
array[2]=3

Notice

陣列屬值類型

陣列屬於值類型,因此改變副本的值,並不會改變本身

example 1

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main(){
var array_1 [3]int = [3]int{1,2,3}
array_2 := array_1

fmt.Println("before array_1:",array_1)
array_2[2] = 100
fmt.Println("after array_1:",array_1)
}

result

1
2
before array_1: [1 2 3]
after array_1: [1 2 3]

example 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

func modify_array(array [3]int){
array[0] = 3
array[1] = 2
array[2] = 1
return
}

func main(){
var array_1 [3]int = [3]int{1,2,3}
fmt.Println("before array_1:",array_1)
modify_array(array_1)
fmt.Println("after array_1:",array_1)
}

result

1
2
before array_1: [1 2 3]
after array_1: [1 2 3]

函數傳參指針類型的陣列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

func modify_array(array *[3]int){ //[1]
array[0] = 3
array[1] = 2 //[2]
(*array)[2] = 1 //[2]
return
}

func main(){
var array_1 [3]int = [3]int{1,2,3}
fmt.Println("before array_1:",array_1)
modify_array(&array_1) //[1]
fmt.Println("after array_1:",array_1)
}

[1] 函數接收陣列指針類型的參數,調用函數時搭配取址符&獲得內存地址
[2] 於函數內部修改陣列中的值時,(*array)[index] 可簡寫成 array[index]即可

result

1
2
before array_1: [1 2 3]
after array_1: [3 2 1]

practice

使用非遞歸的方式實現費波那契數列,打印前20個數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "fmt"


func main(){
var fib_array [20]uint64 = [20]uint64{1,1}
for i:=2;i<len(fib_array);i++ {
fib_array[i] = fib_array[i-1]+fib_array[i-2]
}

for _,v := range fib_array {
fmt.Printf("%d ",v)
}
}

result

1
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 

多維陣列

聲明及初始化

1
2
3
var TwoDimensional [5][3]int

var TwoDimensional = [...][3]int{{1,2,3},{7,8,9}}
  • 利用{}分開不同維度的陣列

遍歷

使用for循環巢式遍歷

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"


func main(){
var TwoDimensional = [...][3]int{{1,2,3},{7,8,9}}
for i,v := range TwoDimensional {
for j,w := range v {
fmt.Printf("col-%d,row-%d value is %d\n",j,i,w)
}
}
}

result

1
2
3
4
5
6
col-0,row-0 value is 1
col-1,row-0 value is 2
col-2,row-0 value is 3
col-0,row-1 value is 7
col-1,row-1 value is 8
col-2,row-1 value is 9