1. 程式人生 > >Go語言中陣列的使用

Go語言中陣列的使用

文章目錄

1 概述

陣列,切片,map是容器資料型別。都是可以儲存多個值的符合型別。
其中陣列是相同型別的一組已編號且長度固定的資料項序列,不用型別和長度是不同的資料型別,例如[5]int, [3]int, [5]byte是不同的型別。

陣列

2 定義語法

// 定義長度和型別,預設使用型別零值進行初始化
var a1 [10]int

// 定義長度和型別,同時初始化部分(全部)元素
// 元素不夠從前到後進行初始化
var a2 = [10]int{1, 2, 3, 4, 5}

// 不指定長度,指定型別。使用初始值確定長度
// 有幾個初始值,長度就是幾
var a3 = [...]int{1, 2, 3, 4, 5, 6}

// 通過索引確定元素值
var a4 = [10]int{0: 1, 3: 2, 5: 3, 4, 5}

3 []索引訪問

索引(index),是從 0 開始,加 1 遞增的。使用 [] 訪問。

arr[0] // 陣列的第一個元素
arr[len(arr)-1] // 陣列的最後一個元素

4 陣列是值型別

陣列為值型別,賦值時會生成新拷貝。這個可能和你熟悉的語言不同,稍稍留意。

5 len() 長度

統計元素個數,一維的統計。如果是多維,僅統計一維元素數量。

6 陣列遍歷

使用 迴圈索引 或者 for range 的語法完成遍歷。

// 迴圈索引
var arr = [...]string{"a", "b", "c", "d", "e", "f"}
for i, l := 0, len(arr); i < l; i++ {
  fmt.Println(arr[i])
}

// for range
var arr = [...]string{"a", "b", "c", "d", "e", "f", "g", "h"}
for i, v := range arr {
  fmt.Println(i, v)
}

7 多維陣列

陣列元素的值可以是陣列型別,稱之為多維陣列,要求內部陣列的長度相同。以二維陣列為例,使用[][]來定義,可以將二維陣列想象成一個行列表格。

var a1 [3][5]int
var a2 = [3][5]string{{"a", "b", "c", "d", "e"}, {"f", "g", "h", "i", "j"}, {"k", "l", "m", "n", "o"}}

以上程式碼就定了二維陣列,第一個使用預設值初始,第二個手動填充。

演示如下
二維陣列

使用雙層迴圈可以遍歷二維陣列:

// 迴圈索引
// 行座標索引
for i := 0; i < 3; i++ {
  // 列座標索引
  for j := 0; j < 5; j++ {
    fmt.Print(a2[i][j], " ")
  }
  fmt.Println()
}

// for range
for _, row := range a2 {
  // fmt.Println(i, row)
  for _, value := range row {
    fmt.Print(value, " ")
  }
  fmt.Println()
}

8 陣列傳參

陣列是值型別,傳參時會發生值拷貝,當使用大陣列時,記憶體的消耗需要考慮。可以考慮使用陣列指標或者切片型別。

func FuncName(p *[9999]float64) {
}

9 ==,!= 陣列間的比較

兩個陣列的型別,長度,元素值,順序都相同,認為兩個陣列相等。

[3]{1, 2, 3} == [4]{1, 2, 3, 4}
// false

[3]{1, 2, 3} == [3]{3, 2, 1}
// false

[3]{1, 2, 3} == [3]{1, 2, 3}
// true

完!
原文出自:小韓說課
微信關注:小韓說課
小韓說課