本文主要記錄了陣列的定義、初始化、遍歷以及二維陣列做簡單介紹。
陣列是同一類的數據型別元素的集合。在Go語言中,陣列在宣告時大小就確定了,並且不可改變,只能修改其陣列的元素。其基本語法如下:
var 陣列變數名 [元素數量]T
//範例,其中陣列的元素數量必須爲常數,並且不可省略,一旦定義其大小不可改變。
var array [5]int
注意:在Go中,陣列元素數量(也叫長度)爲陣列型別的一部分,也就是說長度不同的兩個陣列一定不是同一型別。比如[5]int
與[6]int
是不同的型別,也不可能比較。
陣列的初始化有多種,介紹常見的三種:
func main(){
var array1 [1]int //陣列會初始化爲零值
var array2 = [2]int{1} //使用指定的值初始化陣列
var array3 = [3]string{"你好","China","!!!"} //使用指定的值初始化陣列
fmt.Println(array1) //[0]
fmt.Println(array2) //[1 0]
fmt.Println(array3) //[你好 China !!]
}
上面每次都需要保證陣列的初始值不超過陣列元素的長度,我們可以不指定元素的數量,讓編譯器自己根據元素的數量來推斷陣列的長度,範例:
func main(){
var array1 [1]int
var array2 = [...]int{1, 2}
var array3 = [...]string{"你好","中國","歡迎你"}
fmt.Println(array1)
fmt.Println(array2)
fmt.Printf("type of array2: %T\n",array2)
fmt.Println(array3)
fmt.Printf("type of array3: %T\n",array3)
}
輸出如下:
[0]
[1 2]
type of array2: [2]int
[你好 中國 歡迎你]
type of array3: [3]string
當我們想對一個數組的元素賦值,但賦值元素不連續的時候,可以對其對應索引賦值
func main(){
//對一個數組的第二個元素和第五個元素進行賦值
array := [...]int{1:2, 4:5}
fmt.Println(array)
fmt.Printf("type of array is: %T\n",array)
}
輸出如下:
[0 2 0 0 5]
type of array is: [5]int
在Go中遍歷陣列通常用for控制流程實現,如下範例:
func main() {
var array = [...]int{1, 2, 3, 4, 5}
//使用for 回圈遍歷
for i := 0; i < len(array); i++ {
fmt.Printf("%d ", array[i])
}
fmt.Println()
//使用for range遍歷
for index, value := range array {
fmt.Printf("index:%d ,value:%d\n", index, value)
}
}
輸出如下:
1 2 3 4 5
index:0 ,value:1
index:1 ,value:2
index:2 ,value:3
index:3 ,value:4
index:4 ,value:5
Go語言中存在多維陣列,本文就只以二維陣列爲例。
二維陣列就是在數組裏面巢狀了一個數組,如下範例:
func main() {
array := [3][2]int{
{1, 2},
{2, 3},
{4, 5}, //注意這裏也必須有一個,
}
fmt.Println(array) //列印陣列
fmt.Printf("第2行第2個元素爲:%d\n", array[1][1])
}
輸出如下:
[[1 2] [2 3] [4 5]]
第2行第2個元素爲:3
二維陣列遍歷需要進行回圈的巢狀
func main() {
array := [3][2]int{
{1, 2},
{2, 3},
{4, 5},
}
//使用匿名變數接受不想接受的下標
for _, value1 := range array {
for _, value2 := range value1 { //這兒需要注意值爲value1
fmt.Printf("%d\t", value2)
}
fmt.Println()
}
}
輸出如下:
1 2
2 3
4 5
注:在多維陣列中,編譯器推導長度只會推導第一層的陣列長度,內巢狀的陣列不可使用...
進行陣列長度推導
在Go語言中,若對陣列進行賦值和傳參,會對整個陣列進行復制之後再賦值,所以不會改變原來陣列的值。如下範例:
func changeArray(a [3]int) {
a[0] = 99
fmt.Printf("在changeArray函數中陣列的值:%v\n", a)
}
func changeArray2(a [3][2]int) {
a[1][1] = 99
fmt.Printf("在changeArray2函數中陣列的值:%v\n", a)
}
func main() {
array := [3]int{1, 2, 3}
array2 := [3][2]int{
{11, 12},
{13, 14},
{15, 16},
}
changeArray(array)
fmt.Printf("修改之後array的值:%v\n", array)
changeArray2(array2)
fmt.Printf("修改之後array2的值:%v\n", array2)
}
輸出如下:
[99 2 3]
在changeArray函數中陣列的值:[99 2 3]
修改之後array的值:[1 2 3]
在changeArray2函數中陣列的值:[[11 12] [13 99] [15 16]]
修改之後array2的值:[[11 12] [13 14] [15 16]]