跳轉到

如何有效率重用 Slice

slice是一個動態數組,你可以往裡面加東西(元素),也可以從中取東西,而且它的大小可以根據需要增長或縮小。

現在,假設你的背包已經裝了一些東西,但你想重新開始,清空裡面所有的東西。你有兩個選擇:一是完全換一個新背包(即創造一個全新的slice);二是就用這個背包,但把它搖一搖,讓裡面的東西都消失(即使用slice[:0])。

使用slice[:0]的好處在於,你並沒有換一個新背包(避免了創建一個新的slice),而是復用了原來的。這樣做有幾個優點:

  1. 節省資源:不需要額外的時間和記憶體來創建一個新的slice,因為你正在使用現有的空間。
  2. 提高效率:清空內容(但不釋放記憶體)後,你可以立即重新使用這個slice,而且由於記憶體已經分配,添加新元素時可能不需要立即擴容。
  3. 最佳化效能:對於頻繁清空再重複使用的場景,使用slice[:0]可以減少垃圾回收的壓力,因為你沒有頻繁地建立和丟棄slice

初始化slice

首先,我們有一個初始的slice,裡面包含了一些元素:

numbers := []int{1, 2, 3, 4, 5}

使用slice[:0]重置slice

接下來,我們使用slice[:0]來重置這個slice,但保持其底層數組的容量不變:

numbers = numbers[:0]

現在,numbers看起來是空的,但它背後的陣列還是之前分配的那個,這意味著你可以在不需要分配新記憶體的情況下添加新元素。

向重置後的slice新增元素

然後,你可以開始往這個已經重置的slice中加入新元素:

numbers = append(numbers, 6, 7, 8, 9, 10)

這樣,你就復用了原來的slice(和它的底層數組),在避免了不必要的記憶體分配和垃圾回收的同時,實現了對slice的有效重用。

注意事項

  • 使用slice[:0]時,原slice中的元素並沒有被刪除或清除,它們仍然存在於底層數組中,只是slice的視圖被重置了。如果沒有其他引用指向這些元素,它們將在未來的某個時刻被垃圾收集器回收。
  • 使用slice[:0]重用slice時要謹慎,確保不會意外地改變其他還在使用原底層數組的slice

Reference