Go語言入門:數組


Go語言入門:數組


<code>var firstArray [2] int
fmt.Println(firstArray[0])
firstArray[1] = 1
fmt.Println(firstArray[1])/<code>

這是第一種數組聲明方式,未初始化的元素值默認為0,需要指明數組的長度,然後使用下標索引方式初始化和訪問元素。

簡潔的方式

我們知道Java中數組還有這種初始化方式,直接初始化具體元素,數組長度自動獲得:

<code>int[] intArray = new int[]{1, 2, 3, 4, 5};/<code>

對應在Go中是這樣的:

<code>secondArray := [...]int{1, 2, 3, 4, 5}

//數組的循環
for index, item := range secondArray {
   fmt.Println(index, item)
}
for i := 0; i < len(secondArray); i++ {
   fmt.Println(i, secondArray[i])
}/<code>

有點怪異,不習慣,第一次使用還有可能會把[...]中的...省略了,如果省略了,那就不是一個數組了,而是一個slice,可以用下面的代碼驗證一下:

<code>fmt.Println(reflect.TypeOf([]int{1, 2}))
fmt.Println(reflect.TypeOf([...]int{1, 2}))/<code>

輸出結果是:[]int和[2]int。看著又是很相似的結果,但[]int是slice,[2]int是數組,中括號中有數字表示是數組。

SLICE

說到slice,slice是什麼?先看下slice怎麼得到:

<code>sliceOfArray = secondArray[0:1]
fmt.Println(reflect.TypeOf(sliceOfArray)/<code>

上面的輸出結果也是[]int,和上一段代碼:fmt.Println(reflect.TypeOf([]int{1, 2}))輸出是一樣的。這個slice和Python裡的列表slice很像(Java數組沒有slice功能,只能用apache-commons中的ArrayUtils實現類似功能):

<code>int_list = [1, 2, 3, 4, 5]
sub_list = int_list[0:1]

#python的slice更靈活
print(int_list[0:])
print(int_list[:3])
print(int_list[0:-1])/<code>

從表面使用上看的話,就是取子數組或子列表的功能,但更深入看,Python中的列表slice操作返回的是一個新的子列表,而Go中slice操作返回的不是一個新的子數組,而是一個和原數組共用內存的slice,這樣的設計可以減少切片操作時的內存消耗,提高性能,這裡我們可以把生成的slice看做的原數組的一個子片斷視圖,它本身不存數據,訪問到的元素,還是原數組裡的元素。


分享到:


相關文章: