Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组
1. 數組定義
數組是具有相同唯一類型的一組已編號且長度固定的數據項序列,這種類型可以是任意的原始類型例如整形、字符串或者自定義類型。
2. 聲明數組
Go 語言數組聲明需要指定元素類型及元素個數,語法格式如下:
var varName [SIZE]varType
語法說明如下所示:
- varName(數組變量名):數組聲明及使用時的變量名。
- SIZE(元素數量):數組的元素數量,可以是一個表達式,但最終通過編譯期計算的結果必須是整型數值,元素數量不能含有到運行時才能確認大小的數值。
- Type(數組類型):可以是任意基本類型,包括數組本身,類型為數組本身時,可以實現多維數組。
例如以下定義了數組 a 長度為 10, 類型為 float32:
var a [10]float32
3. 初始化數組
- 指定長度和初始化值,初始化數組中 {} 中的元素個數不能大于 [] 中的數字:
var a = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
默認情況下,數組的每個元素都會被初始化為元素類型對應的零值,對于數字類型來說就是 0,同時也可以使用數組字面值語法,用一組值來初始化數組:
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
- 不指定數組長度,
Go語言會根據元素的個數來設置數組的大小:
var a = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 指定長度,通過索引值進行初始化,沒有初始化的元素使用類型默認值:
a := [3]int{1:1, 3:3}
- 不指定長度,通過索引值進行初始化,數組長度由最后一個索引值確定,沒有指定索引的元素被初始化為類型默認值:
a := []int{1:1, 2:3}
4. 訪問數組
數組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從 0 開始到數組長度減 1 的位置,內置函數 len() 可以返回數組中元素的個數。
var a [3]int // 定義三個整數的數組
fmt.Println(a[0]) // 打印第一個元素
fmt.Println(a[len(a)-1]) // 打印最后一個元素
var salary float32 = balance[9]
5. 數組相等
數組的長度是數組類型的一個組成部分,因此 [3]int 和 [4]int 是兩種不同的數組類型,數組的長度必須是常量表達式,因為數組的長度需要在編譯階段確定。
q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // 編譯錯誤:無法將 [4]int 賦給 [3]int
如果兩個數組類型相同(包括數組的長度,數組中元素的類型)的情況下,我們可以直接通過較運算符(==和!=)來判斷兩個數組是否相等,只有當兩個數組的所有元素都是相等的時候數組才是相等的,不能比較兩個類型不同的數組,否則程序將無法完成編譯。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 編譯錯誤:無法比較 [2]int == [3]int
6. 使用示例
package mainimport "fmt"func main() {// var n [5]int,聲明一個含有 5 個元素的數組,但元素默認都是 0, 一般很少這樣使用var n = []int{10, 20, 30, 40, 50}average_value := get_average(n)fmt.Printf("average_value is %v\n", average_value)for j := 0; j < len(a); j++ { // len(a) 獲取數組長度fmt.Printf("origin array n[%v] is %v\n", j, n[j])}fmt.Printf("###############\n")for i := 0; i < 5; i++ {n[i] = i}for index, value := range n { // 遍歷數組fmt.Printf("new array n[%v] is %v\n", index, value)}}func get_average(array []int) int {array_length := len(array)var sum int = 0for i := 0; i < array_length; i++ {sum += array[i]}average := sum / array_lengthreturn average
}
7. 多維數組
Go 語言支持多維數組,以下為常用的多維數組聲明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
示例
var threedim [5][10][4]int
二維數組是最簡單的多維數組,二維數組本質上是由一維數組組成的。二維數組定義方式如下:
var arrayName [x][y]variableType
arrayName 為數組名,variableType為 Go 語言的數據類型。二維數組中的元素可通過 a[i][j] 來訪問。
7.1 初始化二維數組
// 使用數組字面量來聲明并初始化一個二維整型數組
array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}
// 聲明并初始化數組中索引為 1 和 3 的元素
array = [4][2]int{1: {20, 21}, 3: {40, 41}}
// 聲明并初始化數組中指定的元素
array = [4][2]int{1: {0: 20}, 3: {1: 41}}
下圖展示了上面示例中聲明的二維數組在每次聲明并初始化后包含的值。
7.2 訪問二維數組
二維數組通過指定坐標來訪問。如數組中的行索引與列索引,例如:
val := a[2][3]
/* 或 */
var value int = a[2][3]// 聲明兩個二維整型數組
var array1 [2][2]int
// 將 array1 的索引為 1 的維度復制到一個同類型的新數組里
var array3 [2]int = array1[1]
使用示例
package mainimport "fmt"func main() {/* 數組 - 5 行 2 列*/var a = [5][2]int{ {0,0}, {1,2}, {2,4}, {3,6},{4,8}}var i, j int/* 輸出數組元素 */for i = 0; i < 5; i++ {for j = 0; j < 2; j++ {fmt.Printf("a[%d][%d] = %d\n", i,j, a[i][j] )}}
}
8. 向函數傳遞數組
向函數傳遞數組參數,需要在函數定義時,聲明形參為數組,有以下兩種形式:
(1) 形參設定數組大小
void func(param [10]int){...}
(2) 形參未設定數組大小
void func(param []int){...}
使用示例,函數接收整型數組參數,另一個參數指定了數組元素的個數,并返回平均值。
package mainimport "fmt"func main() {/* 數組長度為 5 */var balance = []int {1000, 2, 3, 17, 50}var avg float32/* 數組作為參數傳遞給函數 */avg = getAverage(balance, 5) ;/* 輸出返回的平均值 */fmt.Printf( "平均值為: %f ", avg );
}func getAverage(arr []int, size int) float32 {var i, sum intvar avg float32 for i = 0; i < size;i++ {sum += arr[i]}avg = float32(sum) / float32(size)return avg
}
總結
以上是生活随笔為你收集整理的Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原浆多少钱一瓶啊?
- 下一篇: 怎么评价电影《来电狂响》?