這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
數組是一個具有相同資料類型
的元素組成的固定長度
的有序集合
。
在Go語言中,數組是實值型別,長度是類型的組成部分,也就是說"[10]int
"和“[20]int
”是完全不同的兩種數群組類型。
同類型的兩個數組支援"=="和"!="比較,但是不能比較大小。
數組作為參數時,函數內部不改變數組內部的值,除非是傳入數組的指標。
數組的指標:*[3]int
指標數組:[2]*int
樣本1:
package mainimport "fmt"func main() { // 這裡我們建立了一個具有5個元素的整型數組 // 元素的資料類型和數組長度都是數組的一部分 // 預設情況下,數組元素都是零值 // 對於整數,零值就是0 var a [5]int fmt.Println("emp:", a) // 我們可以使用索引來設定數組元素的值,就像這樣 // "array[index] = value" 或者使用索引來擷取元素值, // 就像這樣"array[index]" a[4] = 100 fmt.Println("set:", a) fmt.Println("get:", a[4]) // 內建的len函數返回數組的長度 fmt.Println("len:", len(a)) // 這種方法可以同時定義和初始化一個數組 b := [5]int{1, 2, 3, 4, 5} fmt.Println("dcl:", b) // 數組都是一維的,但是你可以把數組的元素定義為一個數組 // 來擷取多維陣列結構 var twoD [2][3]int for i := 0; i < 2; i++ { for j := 0; j < 3; j++ { twoD[i][j] = i + j } } fmt.Println("2d: ", twoD)}
輸出結果為
emp: [0 0 0 0 0]set: [0 0 0 0 100]get: 100len: 5dcl: [1 2 3 4 5]2d: [[0 1 2] [1 2 3]]
擁有固定長度
是數組的一個特點,但是這個特點有時候會帶來很多不便,尤其在一個集合元素個數不固定的情況下。這個時候我們更多地使用切片
。
樣本2:
可以用new建立數組,並返回數組的指標
package mainimport "fmt"func main() { var a = new([5]int) test(a) fmt.Println(a, len(a))}func test(a *[5]int) { a[1] = 5}
輸出結果
&[0 5 0 0 0] 5
樣本3:
package mainimport "fmt"func main() { a := [...]User{ {0, "User0"}, {8, "User8"}, } b := [...]*User{ {0, "User0"}, {8, "User8"}, } fmt.Println(a, len(a)) fmt.Println(b, len(b))}type User struct { Id int Name string}
輸出結果
[{0 User0} {8 User8}] 2[0x1f216130 0x1f216140] 2
樣本4(練習):
package main import ( "fmt") func main() { var arr_1 [10]int var sum int fmt.Println("\nlen(arr_1): ", len(arr_1)) fmt.Println("initial value of arr_1:") for _, elem := range arr_1 { fmt.Print(elem, " ") } fmt.Println("\ninitial value of sum: ", sum, "\n") fmt.Println("arr_1:") for i := 0; i < len(arr_1); i++ { arr_1[i] = len(arr_1) - 1 - i fmt.Println(arr_1[i]) } fmt.Println("\neach set of range arr_1:\nidx val\n-------") for idx, val := range arr_1 { fmt.Println(idx, val) } for _, elem := range arr_1 { sum += elem } fmt.Print("\nsum of arr_1: ", sum, "\n\n") // define array with length unknown, must initialize when defining var arr_2 = [...]string{ "Sun", "Air", "Water"} fmt.Println("arr_2:") for _, elem := range arr_2 { fmt.Println(elem) } fmt.Println()}
輸出結果
len(arr_1): 10initial value of arr_1:0 0 0 0 0 0 0 0 0 0 initial value of sum: 0 arr_1:9876543210each set of range arr_1:idx val-------0 91 82 73 64 55 46 37 28 19 0sum of arr_1: 45arr_2:SunAirWater