背景

从数组中删除一个元素是开发中经常会遇到的问题,今天探讨一下golang中有哪些优雅的删除方法

方案

方案一:移动法

思路:直接删除指定位置的元素,后面的元素依次往前移动一位

该方法保证了元素的顺序,但是如果数组过大的话,移动的代价较大,影响效率

func remove2(s []int, i int) []int {
	if i < 0 || i >= len(s) {
		return s
	}
	s[i] = s[len(s)-1]
	s=append(s[:i],s[i+1:]...)
	return s
}

方案二:替换法

思路:将要删除的元素和数组的最后一个元素替换,然后数组的长度-1

该方法删除后不能保证之前的元素顺序,适合于对顺序不敏感的使用场景

func remove(s []int, i int) []int {
	if i < 0 || i >= len(s) {
		return s
	}
	s[i] = s[len(s)-1]
	return s[:len(s)-1]
}

方案二:置0法

思路: 如果既不想改变数组中元素的顺序,也不想大面积移动元素,那么可以考虑将数组中元素用特殊元素替换的方式,例如,将元素用0或者-1替换的方式,后面判断的时候只需要判断元素的反特征进行遍历

参考