數組聲明的格式是:
var identifier [len]type
例如:
var arr1 [5]int
對索引項為 i 的數組元素賦值可以這么操作:arr[i] = value
,所以數組是 可變的。
由於索引的存在,遍歷數組的方法自然就是使用 for 結構:
IDIOM:
for i:=0; i < len(arr1); i++{ arr1[i] = ... }
也可以使用 for-range 的生成方式:
IDIOM:
for i,_:= range arr1 { ... }
在這里i也是數組的索引。當然這兩種 for 結構對於切片(slices)(參考 第 7 章)來說也同樣適用。
問題 7.1 下面代碼段的輸出是什么?
a := [...]string{"a", "b", "c", "d"} for i := range a { fmt.Println("Array item", i, "is", a[i]) }
Go 語言中的數組是一種 值類型(不像 C/C++ 中是指向首元素的指針),所以可以通過 new()
來創建: var arr1 = new([5]int)
。
那么這種方式和 var arr2 [5]int
的區別是什么呢?arr1 的類型是 *[5]int
,而 arr2的類型是 [5]int
。
這樣的結果就是當把一個數組賦值給另一個時,需要在做一次數組內存的拷貝操作。例如:
arr2 := *arr1 arr2[2] = 100
這樣兩個數組就有了不同的值,在賦值后修改 arr2 不會對 arr1 生效。
所以在函數中數組作為參數傳入時,如 func1(arr2)
,會產生一次數組拷貝,func1 方法不會修改原始的數組 arr2。
如果你想修改原數組,那么 arr2 必須通過&操作符以引用方式傳過來,例如 func1(&arr2),下面是一個例子
示例 7.2 pointer_array.go:
package main
import "fmt" func f(a [3]int) { fmt.Println(a) } func fp(a *[3]int) { fmt.Println(a) } func main() { var ar [3]int f(ar) // passes a copy of ar fp(&ar) // passes a pointer to ar }
輸出結果:
[0 0 0]
&[0 0 0]
另一種方法就是生成數組切片並將其傳遞給函數(詳見第 7.1.4 節)。
摘自:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.1.md