陣列是同一型別元素的集合,陣列的型別字面量由兩部分構成:陣列的長度、元素的型別。
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 求切片的容量。定義切片的時候,把陣列長...