Go 學習筆記(10) 陣列

2021-09-11 17:41:37 字數 3129 閱讀 4309

陣列是同一型別元素的集合,陣列的型別字面量由兩部分構成:陣列的長度、元素的型別。

type mynumbers [3]int

複製**

建立陣列時,如果只宣告不賦值,其中各元素均為元素型別的零值(或稱預設值)。

宣告數時賦值:

var a [3]int

// [0 0 0]

a[0] = 10

a[1] = 20

a[2] = 30

// [10 20 30]

var b [3]int = [3]int // [1 2 3] 一般情況下,我們會省略型別: var b = [3]int

var c = [3]int // [1 0 0]

var d = [...]int // [1 2 3 4]

var e = [3]int // [0 1 0]

var f = [...]string // [ a b c],第乙個元素是空字串

複製**

可以通過索引訪問或修改元素,初始索引為 0

package main

import

"fmt"

func

main()

fmt.println(a[0]) // a

fmt.println(a[0:2]) // [a b] 包括 a[0],不包括 a[2]

fmt.println(a[0:]) // [a b c]

fmt.println(a[:3]) // [a b c]

// fmt.println(a[:5]) // 報錯

}複製**

通常使用for...range...來遍歷陣列:

package main

import

"fmt"

func

main()

// 傳統方法遍歷

for i := 0; i < len(a); i++

// 只能得到索引

for index := range a

// 索引和元素

for index, val := range a

// 丟棄索引

for _, val := range a

}複製**

如果陣列的元素型別是可以相互比較的,那麼陣列型別也是可以相互比較的。

只有當兩個陣列的所有元素都是相等的時候陣列才是相等的。陣列長度也是陣列型別的一部分,所以[5]int[10]int是屬於不同型別的。

a := [2]int

b := [...]int

c := [2]int

fmt.println(a == b, a == c, b == c) // true false false

// d := [3]int

// fmt.println(a == d) // invalid operation: a == d (mismatched types [2]int and [3]int)

複製**

關於函式,後面再詳細介紹

go中,所有的傳參都是傳值,而不是傳遞引用(python中不能簡單的說是傳遞值或者引用,主要根據引數是可變型別還是不可變型別)。所以函式引數變數接收的是乙個複製的副本,並不是原始呼叫的變數,並且對陣列引數的任何的修改都是發生在複製的陣列上,並不能直接修改呼叫時原始的陣列變數,因此傳遞大的陣列型別是低效的。

當然,我們可以顯式地傳入乙個陣列指標。(但這在go中並不常用,通常使用切片)

下面的例子並不能改變陣列a的值,因為傳遞的是a的副本:

package main

import (

"fmt"

)func main

() fmt.println(a) // [1 2 3]

zero(a)

fmt.println(a) // [1 2 3]

}// 將陣列元素清零的函式

func zero(a [3]int)

fmt.println(a) // [0 0 0]

}複製**

傳遞指標(&是取址符,&var可以獲得變數var的記憶體位址,*ptr獲得指標ptr的值。指標那節再詳細介紹):

package main

import (

"fmt"

)func

main()

fmt.println(a) // [1 2 3]

zero(&a)

fmt.println(a) // [0 0 0]

}func

zero

(ptr *[3]int)

// *ptr = [3]int{} // 上述迴圈更簡潔的寫法

fmt.println(*ptr) // [0 0 0]

}複製**

陣列通常是一維的,但是可以用來組裝成多維陣列,例如:[3][5]int[2][2][2]float64,內部陣列總是長度相同的。

go語言的多維陣列是矩形式的(唯一的例外是切片的陣列)。

a := [3][2]int{}                         // [[0 0] [0 0] [0 0]]

b := [3][2]int} // [[1 2] [0 0] [0 0]]

c := [3][2]int, , } // [[1 2] [3 4] [5 6]]

複製**

go學習記 (10)陣列與切片

陣列與切片 陣列陣列是值型別。取位址 變數名 陣列的第乙個元素的位址,就是陣列的位址 陣列的每個元素的位址間隔是依據陣列的型別決定,比如int64 8 interweb2 4 四種陣列初始化方式var numsarray01 3 int 3 int var numsarray02 3 int var...

awk學習筆記 10 陣列

awk中的陣列 awk中的陣列跟php中的很像,使用前都不需要宣告,都可以用字串做下標。我們建立乙個reg.dat檔案來記錄使用者選修的課程 mary o.s.arch.discrete steve d.s.algorithm arch.wang discrete graphics o.s.lisa...

Go 學習筆記 04 陣列 切片

陣列長度指定之後,不可修改。會自行推斷陣列長度。var arr int指定索引值來初始化陣列。arr int輸出 1 20 20 0 0 50 基本資料型別和陣列都是值型別,是引用型別。golang 中申明切片之後,切片預設值就是nil。len 取長度,cap 求切片的容量。定義切片的時候,把陣列長...