Go 移除 slice 特定 index 的元素會打亂順序
Go 沒有內建的 remove。常見的做法是把要刪的跟最後一個交換,再切掉尾巴——O(1),但順序會變。
func removeAtIndex(source []int, index int) []int {
lastIndex := len(source) - 1
source[index], source[lastIndex] = source[lastIndex], source[index]
return source[:lastIndex]
}
// removeAtIndex([]int{1,2,3,4,5}, 2) → [1 2 5 4] ← 原本的 5 跑到中間移除最後一個則沒有這個問題:scores[:len(scores)-1]。
要保留順序就得整段搬
source = append(source[:index], source[index+1:]...) // O(n)代價是把後面的元素整段往前搬一格。取捨很直接:不在乎順序就用交換法,在乎就付 O(n)。
⚠️ 兩種寫法都是就地改寫底層 array,被切掉的位置仍留著舊值。如果還有別的 slice 看著同一塊 array,它們會看到被搬動過的內容——見 切割出的 slice 預設 cap 吃到底,append 會寫進鄰居的地盤。