Go語(yǔ)言入門(mén):數(shù)組

第一種聲明方式

var firstArray [2] int
fmt.Println(firstArray[0])
firstArray[1] = 1
fmt.Println(firstArray[1])

這是第一種數(shù)組聲明方式,未初始化的元素值默認(rèn)為0,需要指明數(shù)組的長(zhǎng)度,然后使用下標(biāo)索引方式初始化和訪問(wèn)元素。

簡(jiǎn)潔的方式

我們知道Java中數(shù)組還有這種初始化方式,直接初始化具體元素,數(shù)組長(zhǎng)度自動(dòng)獲得:

int[] intArray = new int[]{1, 2, 3, 4, 5};

對(duì)應(yīng)在Go中是這樣的:

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

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

有點(diǎn)怪異,不習(xí)慣,第一次使用還有可能會(huì)把[...]中的...省略了,如果省略了,那就不是一個(gè)數(shù)組了,而是一個(gè)slice,可以用下面的代碼驗(yàn)證一下:

fmt.Println(reflect.TypeOf([]int{1, 2}))
fmt.Println(reflect.TypeOf([...]int{1, 2}))

輸出結(jié)果是:[]int和[2]int。看著又是很相似的結(jié)果,但[]int是slice,[2]int是數(shù)組,中括號(hào)中有數(shù)字表示是數(shù)組。

SLICE

說(shuō)到slice,slice是什么?先看下slice怎么得到:

sliceOfArray = secondArray[0:1]
fmt.Println(reflect.TypeOf(sliceOfArray)

上面的輸出結(jié)果也是[]int,和上一段代碼:fmt.Println(reflect.TypeOf([]int{1, 2}))輸出是一樣的。這個(gè)slice和Python里的列表slice很像(Java數(shù)組沒(méi)有slice功能,只能用apache-commons中的ArrayUtils實(shí)現(xiàn)類(lèi)似功能):

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])

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容