Go語言之陣列

2020-08-12 22:50:58

前言

本文主要記錄了陣列的定義、初始化、遍歷以及二維陣列做簡單介紹。

陣列的定義

陣列是同一類的數據型別元素的集合。在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]]