go語言筆記——數組長度不可變,但是元素值是可變的!!!


數組聲明的格式是:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM