2 回答

TA貢獻1884條經驗 獲得超4個贊
切片基本上是一個指向內存的指針,帶有一些附加信息:
1)當前使用的元素數量和
2)容量,即它能占用的剩余長度。
一開始我們創建了一個包含 6 個整數的切片,這使得 go 也創建了總大小為 6 的底層 int 數組。
here is your memory locations with addresses (content does not matter here)
* * * * * *
[0][1][2][3][4][5]
^
s points to the start of the memory
len(s) = 6
cap(s) = 6
接下來我們說:讓這個slice'slen為0,這就是在位置0s = s[:0]處取一個長度為0的子切片。s注意s[0:0]是一樣的,你可以省略第一個0。
[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 0
cap(s) = 6
由于容量仍然相同,我們不妨將長度設為 4 s = s[:4]。
* * * *
[0][1][2][3][4][5]
^
s still points to the start of the memory
len(s) = 4
cap(s) = 6
然后我們通過做一個不在內存開頭的子切片s = s[2:]。
* *
[0][1][2][3][4][5]
^
s now points to the original address plus two!
len(s) = 2
cap(s) = 4

TA貢獻1807條經驗 獲得超9個贊
這是幫助我更好地理解這個概念的片段:
切片是數組段的描述符。它由指向數組的指針、段的長度及其容量(段的最大長度)組成。
切片不能超出其容量。嘗試這樣做會導致運行時恐慌,就像索引超出切片或數組邊界時一樣。同樣,不能將切片重新切片到零以下以訪問數組中較早的元素。
如果數組中有更多元素,則可以擴展切片,但它不能訪問切片 0 以下的元素。它是底層數組的窗口
- 2 回答
- 0 關注
- 143 瀏覽
添加回答
舉報