10-GoLang陣列
- 1.和C語言一樣,Go語言中也有陣列的概念, Go語言中的陣列也是用於儲存一組相同型別的資料
- 2.和C語言一樣,Go語言中的陣列也分為一維陣列和多維陣列
-
3.C語言中定義陣列的格式
int ages[3]; -
4.Go語言中定義陣列的格式
var ages [3]int -
5.C語言中運算元組的格式:
ages[索引]; - 6.Go語言中運算元組的格式和C語言一樣
var ages [3]int = [3]int{1, 3, 5} // 取出陣列中儲存的值 fmt.Println(ages)//[1 3 5] fmt.Println(ages[0]) fmt.Println(ages[1]) fmt.Println(ages[2])
-
7.C語言中陣列的初始化方式有好幾種
7.1先定義再初始化
只能逐個初始化, 不能一次性初始化
7.2定義的同時初始化
int ages[3] = {1, 3, 5}// 完全初始化
int ages[3] = {1, 3} // 部分初始化
int ages[3] = {[2] = 3} // 指定元素, 部分初始化
int ages[] = {1, 3, 5} // 如果定義的同時初始化, 元素個數可以省略
-
8.Go語言中陣列的初始化方式有好幾種
8.1先定義再初始化
// 1.定義一個數組 var ages [3]int // 2.給陣列指定索引(下標)的元素賦值 ages[0] = 123 ages[1] = 456 ages[2] = 789
Go語言中的陣列可以先定義再一次性初始化
// 1.定義一個數組 var ages [3]int // Go語言中的陣列可以先定義再一次性初始化 ages = [3]int{1, 3, 5}
8.2定義的同時初始化
// 1.定義的同時初始化 var ages [3]int = [3]int{1, 3, 5} // 完全初始化 //var ages [3]int = [3]int{1, 3} // 部分初始化 //var ages [3]int = [3]int{2:5} // 指定元素初始化
-
Go語言陣列和C語言一樣可以省略元素個數,但是有格式要求
// [...]的含義, 讓編譯器根據賦值的元素個數自動計算陣列的元素個數 ages := [...]int{1, 3, 5} // 省略元素個數
注意點:
-
1.Go語言給陣列一次性賦值的時候一定要在值的前面加上陣列的型別
var 陣列名稱 資料型別 = 資料型別{x , y, z}
而且必須要和資料型別一模一樣 - 2.C語言中的陣列如果沒有初始化儲存的是垃圾資料, 但是Go語言的陣列 沒有初始化儲存的不是垃圾資料, 而是對應型別的零值
零值: int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/rune/uintptr的預設值是0 float32/float64的預設值是0.0 bool的預設值是false string的預設值是"" pointer/function/interface/slice/channel/map/error的預設值是nil
- 陣列在Go語言中是值型別 ,, 所以陣列之間的賦值是拷貝關係 , 而不是指向的關係 (C語言陣列是指向關係)
- 所以陣列作為引數傳遞時也是值拷貝,在函式中修改陣列元素值,不會影響原陣列
package main import "fmt" func main() { ages := [3]int{1, 3, 5} change(ages) fmt.Println(ages)//[1 3 5] } func change(nums [3]int){ nums[1] = 666 }
- 如果想讓兩個陣列可以相互賦值, 那麼兩個陣列的**型別必須一致,型別一致包括元素個數, 元素個數也是Go語言中陣列型別的一部分
var ages [3]int = [3]int{1, 3, 5} var nums [3]int nums = ages fmt.Println(ages)//[1 3 5] fmt.Println(nums)//[1 3 5]
- 如果陣列中儲存的元素型別支援== != 操作,而且兩個陣列的型別是一個樣的,那麼陣列也支援== !=操作
var ages [3]int = [3]int{1, 3, 5} var nums [3]int = [3]int{1, 2, 5} res := ages == nums fmt.Println(res)//false
- Go語言中遍歷陣列
- 1.傳統的for迴圈遍歷陣列
ages := [3]int{1, 3, 5} for i:=0; i < 3; i++ { //fmt.Println(ages[i])//135 fmt.Printf("index = %d, value = %d\n", i, ages[i]) }
- 2.高階for迴圈來遍歷陣列(相當於其他語言中的forin迴圈)
//range函式的兩個返回值變數名任取 //for i,v:=range ages{ // fmt.Println(i,v) //} for index, value := range ages { fmt.Println(index, value) } /* 0 1 1 3 2 5 */
-
定義二維陣列的格式
var 陣列名稱 [行數][列數]資料型別
var 陣列名稱 [一維陣列的個數][每個一維陣列的元素個數]資料型別
var arr [2][3]int = [2][3]int{ {1,2,3}, {4,5,6}, } fmt.Println(arr)//[[1 2 3] [4 5 6]]
- 修改陣列元素方式和C語言一樣
var values [2][3]int = [2][3]int{ {1, 3, 5}, {2, 4, 5}, } values[0][1] = 666 fmt.Println(values)//[[1 666 5] [2 4 5]]
-
注意點:
二維陣列也可以省略元素個數, 但是隻能省略行數, 不能省略列數
//省略的元素個數必須用...代替,若[]中不寫...則代表的是切片,而非陣列 values := [...][3]int{ {1, 3, 5}, {2, 4, 5}, } fmt.Println(values)//[[1 3 5] [2 4 5]] // 這裡代表定義了一個切片, 切片中儲存的是陣列 //values := [][3]int{ //{1, 3, 5}, //{2, 4, 5}, //} // 這裡代表定義了一個切片, 切片中儲存的是切片 //values := [][]int{ //{1, 3, 5}, //{2, 4, 5}, //}