我一直在嘗試切片。這是一個示例程序for n := 1; n <= 10; n++ { a := make([]int, 0) for j := 0; j < n; j++ { a = append(a, 0) } b := a[:1] a = append(a, 0) a[0] = 1 fmt.Println(n, b[0])}輸出是1 02 03 14 05 16 17 18 09 110 1我明白這里發生了什么。a = append(a, 0)如果舊數組的長度不足,則該行分配一個新數組,并且新數組的長度是原始數組的兩倍。因此,如果n是 2 的冪,則這條線a[0] = 1不會更改所支持的數組,b因為新數組將在之前的行中分配。但是,我在文檔中找不到明確聲明新分配的數組始終具有兩倍的長度。這是否意味著我的代碼依賴于實現?以這種方式將另一個切片的切片存儲在變量中是不好的做法,還是應該a[j:k]每次需要子切片時都這樣做?
2 回答

慕碼人2483693
TA貢獻1860條經驗 獲得超9個贊
底層數組的大小加倍是一個實現細節(在當前實現中,一旦大小達到某個閾值,就不再是這樣了)。所以你不能依靠這個來選擇性地改變b[0]
或不改變。
不幸的是,我不明白你的最后兩個問題。分片沒有任何問題,它不依賴于顯式 ( a[i:k]
) 或隱式開始或停止索引 (a[i:]
或a[:k]
),因為這是完全相同的。

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
你已經知道答案了。
它依賴于實現
如果要更改底層數組/切片,則將切片子切片為 var 是不好的做法
您最好在需要時明確使用子切片 - 它很便宜。
不過是個好問題。感謝分享。
- 2 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消