2 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
這完全是一個(gè)約定問題,當(dāng)然還有其他方法可以做到(例如,Matlab 使用第一個(gè)索引為 1 的數(shù)組)。選擇實(shí)際上取決于您想要什么屬性。事實(shí)證明,使用 0 索引數(shù)組,其中切片是包含不包含的(即,從 a 到 b 的切片包含元素 a 并排除元素 b)具有一些非常好的屬性,因此這是一個(gè)非常常見的選擇。這里有一些優(yōu)點(diǎn)。
0 索引數(shù)組和包含-排除切片的優(yōu)點(diǎn)
(請(qǐng)注意,我使用的是非 Go 術(shù)語,所以我將以 C 或 Java 談?wù)撍鼈兊姆绞秸務(wù)摂?shù)組。數(shù)組就是 Go 所說的切片,而切片是子數(shù)組(即“切片從索引 1 到索引 4"))
指針?biāo)阈g(shù)有效。如果您使用像 C 這樣的語言,數(shù)組實(shí)際上只是指向數(shù)組中第一個(gè)元素的指針。因此,如果您使用 0 索引數(shù)組,那么您可以說索引i處的元素只是數(shù)組指針加i 所指向的元素。例如,如果我們有一個(gè)數(shù)組[3 2 1],數(shù)組的地址為10(假設(shè)每個(gè)值占用一個(gè)字節(jié)的內(nèi)存),那么第一個(gè)元素的地址為10 + 0 = 10,則第二個(gè)的地址是 10 + 1 = 11,依此類推。簡(jiǎn)而言之,它使數(shù)學(xué)變得簡(jiǎn)單。
切片的長(zhǎng)度也是切片的地方。也就是說,對(duì)于一個(gè)數(shù)組arr,arr[0:len(arr)]就是它arr本身。這在實(shí)踐中非常有用。例如,如果我調(diào)用n, _ := r.Read(arr)(其中n是讀入的字節(jié)數(shù)arr),那么我可以只arr[:n]獲取與arr實(shí)際寫入的數(shù)據(jù)對(duì)應(yīng)的切片arr。
指數(shù)不重疊。這意味著如果我有arr[0:i], arr[i:j], arr[j:k], arr[k:len(arr)],這些切片完全覆蓋arr自身。您可能不會(huì)經(jīng)常發(fā)現(xiàn)自己將數(shù)組劃分為這樣的子切片,但它具有許多相關(guān)的優(yōu)點(diǎn)。例如,考慮以下代碼以基于非連續(xù)整數(shù)拆分?jǐn)?shù)組:
func consecutiveSlices(ints []int) [][]int {
ret := make([][]int, 0)
i, j := 0, 1
for j < len(ints) {
if ints[j] != ints[j-1] + 1 {
ret = append(ret, ints[i:j])
i = j
}
}
ret = append(ret, ints[i:j])
}
(這段代碼顯然不能很好地處理一些邊緣情況,但你明白了)
如果我們嘗試使用 inclusive-inclusive 切片來編寫等效的函數(shù),它會(huì)復(fù)雜得多。
如果有人能想到更多,請(qǐng)隨時(shí)編輯此答案并添加它們。

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
對(duì)于字符串、數(shù)組、指向數(shù)組的指針或切片 a,主要表達(dá)式
a[low : high]構(gòu)造一個(gè)子串或切片。索引 low 和 high 選擇操作數(shù) a 的哪些元素出現(xiàn)在結(jié)果中。結(jié)果的索引從 開始,
0
長(zhǎng)度等于high - low
。為方便起見,可以省略任何索引。缺失的低指數(shù)默認(rèn)為零;缺少的高索引默認(rèn)為切片操作數(shù)的長(zhǎng)度
對(duì)于數(shù)組或字符串,如果 0 <= low <= high <= len(a),則索引在范圍內(nèi),否則它們超出范圍。對(duì)于切片,索引上限是切片容量 cap(a) 而不是長(zhǎng)度。常量索引必須是非負(fù)的并且可以用 int 類型的值表示;對(duì)于數(shù)組或常量字符串,常量索引也必須在范圍內(nèi)。如果兩個(gè)指數(shù)都是常數(shù),則它們必須滿足 low <= high。如果索引在運(yùn)行時(shí)超出范圍,則會(huì)發(fā)生運(yùn)行時(shí)恐慌。
對(duì)于q := p[m:n]
,q
是p
從 index 開始m
的一段n-m
元素長(zhǎng)度的切片。
- 2 回答
- 0 關(guān)注
- 225 瀏覽
添加回答
舉報(bào)