首先,要回答你的問題,沒有它不可能使用負的索引或訪問這些數據,除了通過保持原片的副本。
然而,這是一個有趣的問題,因爲這裏有一個不一致的地方,你已經指出,這可能更多的是你問的。如果你有一個分片開始爲here:
a := []int{2, 3, 5, 7, 11, 13}
fmt.Println(a,len(a),cap(a))
[2 3 5 7 11 13] 6 6
而採取的只是中間
b := a[1:2]
fmt.Println(b,len(b),cap(b))
[3] 1 5
片你不允許訪問索引中的原始數據過去那種如你所料:
fmt.Println(b[3])
panic: runtime error: index out of range
不允許您從一開始索引之前重新劃分爲包括數據再次:
d := b[-1:]
invalid slice index -1 (index must be non-negative)
但你是允許重新劃分爲包括數據的len個後再次達到上限,這是一個有點奇怪:
// This is beyond the length of b, you can't index those,
// but you can access them by reslicing
c := b[:5]
[3 5 7 11 13] 5 5
這有點不一致,因爲對切片數據的大多數其他操作受數據和len的偏移限制,而不是上限和原始數據長度。然而,這在規範中有明確規定,可能僅僅是片斷代表原始陣列上的視圖而不是提供對該數據訪問的有意設計決策的一種人造物。如果你可以回到原始存儲器,它可能會很好,因爲它仍然在內存中,但是看起來你只能看到陣列的末端達到了上限,而不是在你已經切片一次後纔開始。從spec關於切片指標限制:
For arrays or strings, the indices are in range if 0 <= low <= high <= len(a), otherwise they are out of range. For slices, the upper index bound is the slice capacity cap(a) rather than the length. A constant index must be non-negative and representable by a value of type int; for arrays or constant strings, constant indices must also be in range. If both indices are constant, they must satisfy low <= high. If the indices are out of range at run time, a run-time panic occurs.
這可能會更好是安全的,使用原來的切片上的數據創建不同的看法,而不是依賴於這種行爲。