3.1數組
數組是一個由固定長度的特定類型元素組成的序列,一個數組可以由零個或多個元素組成。數組中每個元素類型相同,又是連續分配,因此可以以固定的速度索引數組中的任何數據,速度非常快。
3.1.1聲明和初始化
1、使用字面量聲明數組:
array := [5]int{10, 20, 30, 40, 50}
2、自動計算聲明數組的長度
//容量由初始化值的數量來決定
array := [...]int{10, 20, 30, 40, 50}
3、聲明數組並指定特定元素的值
array := [5]int{1: 10, 2: 20}
4、指針數組
//聲明包含5個元素的指向整數的數組,並用整型指針初始化索引為0和1的數組元素
array := [5]*int{0: new(int), 1: new(int)}
3.1.2 使用數組
1、訪問數組元素
array := [5]int{10, 20, 30, 40, 50}
array[2] = 35 //修改索引為2的元素的值
2、訪問指針數組的元素
array := [5]*int{0: new(int), 1: new(int)}
*array[0] = 10
*array[1] = 20
3、數組的長度是數組類型的一個組成部分,同一類型的數組才可以用”==”相互比較。
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) //compile error: cannot compare [2]int == [3]int
3.1.3 在函數間傳遞數組
在函數之間傳遞變量時,總是以值的方式傳遞的。如果這個變量是個數組,意味着整個數組都會完整的復制,並傳遞給函數。這就意味着對數組參數的任何修改都是發生在復制的數組上,並不能直接修改調用時原始的數組變量。
1、使用值傳遞,在函數間傳遞大數組
每次foo被調用時,必須在棧上分配8M的內存,之后整個數組的值被復制到剛分配的內存里。
//聲明一個8M大小的數組 var array [1e6]int func foo(array [1e16]int) { ... } foo(arry) //將數組傳遞給函數foo
2、使用指針在函數間傳遞大數組
將數組的地址傳入函數,只要在棧上分配4字節的內存給指針就可以。由於傳遞的是指針,所以如果改變指針指向的值,就會改變共享的內存。
var array [1e6]int
func foo(array *[1e16]int) {
...
}
foo(&arry) //將數組的地址傳遞給函數foo