3 回答

TA貢獻1802條經驗 獲得超10個贊
引用規范:切片表達式:
對于數組或字符串,如果,則索引在范圍內
0 <= low <= high <= len(a)
,否則它們超出范圍。對于切片,索引上限是切片容量cap(a)
而不是長度。
所以本說明書中允許使用指數高達len(a)
底層的陣列,len(a)
包括(或cap(a)
在在這種情況下具有相同的值的切片的情況下)。這就是為什么a[3:]
在你的情況下不恐慌。
但它當然會產生一個空切片,因為:
a[low : high]
意味著結果的索引從 at 開始,0
長度等于high - low
and 由于high
被省略,它默認為len(a)
so len(a) - len(a) = 0
。
而且(根據規范)使用索引> len(a)
將超出范圍,因此會導致運行時恐慌:
如果索引在運行時超出范圍,則會發生運行時恐慌。

TA貢獻1852條經驗 獲得超7個贊
a[3:] 構建一個空切片,它就像一個空數組一樣,是一個有效且有用的對象(在所有語言中,不僅僅是在 Go 中)。
空切片也仍然指向底層數組、位置和容量,有時可以擴展:
a := []int{1, 2, 3}
emptySlice := a[1:1]
fmt.Println(emptySlice) // []
notEmpty := emptySlice[0:2]
fmt.Println(notEmpty) // [2 3]
另一方面,具有負長度的切片是不一致的。它沒有任何意義,因此被禁止。

TA貢獻1921條經驗 獲得超9個贊
因為在切片中有0元素 ( 3-3) 是完全有效的。但是有-1元素 ( 3-4) 不是。
這種行為也與其他語言一致。例如,Java:
System.out.println(Arrays.asList(1, 2, 3).subList(0, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(1, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(2, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(3, 3));
System.out.println(Arrays.asList(1, 2, 3).subList(4, 3));
只有最后一個語句失敗。
- 3 回答
- 0 關注
- 275 瀏覽
添加回答
舉報