亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

切片切片參考

切片切片參考

Go
智慧大石 2023-04-04 14:14:23
我正在參觀 Golang 網站,我正在嘗試消化其中一個示例。目前還不清楚它是如何工作的:package mainimport "fmt"func main() {    s := []int{2, 3, 5, 7, 11, 13}    printSlice(s)    // Slice the slice to give it zero length.    s = s[:0]    printSlice(s)    // Extend its length.    s = s[:4]    printSlice(s)    // Drop its first two values.    s = s[2:]    printSlice(s)}func printSlice(s []int) {    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)}輸出是:len=6 cap=6 [2 3 5 7 11 13]len=0 cap=6 []len=4 cap=6 [2 3 5 7]len=2 cap=4 [5 7]在第一個切片之后,s = s[:0]切片長度為0。然后是另一個切片s = s[:4]。雖然長度為 0,但這似乎有效。但是這是怎么發生的呢?底層數組不應該可以從訪問嗎s?更讓我困惑的是,下一次切片時,s = s[2:]我們切片的是 s 的舊值(有 4 個元素),而不是原始數組。有人可以闡明這兩種情況有什么區別嗎?
查看完整描述

2 回答

?
慕村9548890

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


查看完整回答
反對 回復 2023-04-04
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

這是幫助我更好地理解這個概念的片段:

切片是數組段的描述符。它由指向數組的指針、段的長度及其容量(段的最大長度)組成。

切片不能超出其容量。嘗試這樣做會導致運行時恐慌,就像索引超出切片或數組邊界時一樣。同樣,不能將切片重新切片到零以下以訪問數組中較早的元素。

如果數組中有更多元素,則可以擴展切片,但它不能訪問切片 0 以下的元素。它是底層數組的窗口

查看完整回答
反對 回復 2023-04-04
  • 2 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號