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 會寫進鄰居的地盤

相關:Go 的切割上限是 cap 而不是 len