introduction 定義:有固定長度 且裏頭的每個元素都為同一種數據類型 之序列
聲明 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 } var array = [4 ]int {1 ,2 ,3 } var array = [...]int {1 ,2 ,3 ,4 ,} var array = [5 ]string {3 :"Hello" ,2 :"100" }
[1] 如果未填滿陣列長度對應的值,會自動將未填入位置填入0 [2] 聲明的部分可不寫類型,Go會自動做類型推導 [3] 如果陣列太長不得而知長度又懶得數,可用...
代替長度,編譯器會自動數
但是初始化時後面跟了多少元素,便為其長度,不得修改
[4] 可直接指定下標 初始化,元素欄裡的格式為{index:值} (重要)
其他未初始化的值會初始化為0,空字符串,或是false…等
元素賦值 訪問index賦值
1 2 3 4 var array [10 ]int array[0 ] = 1 array[1 ] = 2 array[9 ] = 9
遍歷陣列 使用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 mainimport "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 mainimport "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 mainimport "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) }
[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 mainimport "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) } }
result1 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 mainimport "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