在语言教程中,我们了解到:
片类似于数组的引用。
片不存储任何数据,它只是描述底层数组的一部分。
改变片的元素将修改其底层数组的相应元素。
出于这个原因,在片上使用附加函数而不考虑我们正在处理的值的起源和目的地是非常危险的,也是错误的。
因此,正确的解决方案是使用引用到新数组而不是“主”数组的片。
这可以通过make构造创建一个新切片来实现。
func removeAt(slice []int, index int) []int {
newSlice := make([]int, 0) //Create a new slice of type []int and length 0
newSlice = append(newSlice, slice[:index]...) //Copies the values contained in the old slice to the new slice up to the index (excluded)
if index != len(slice)-1 {
newSlice = append(newSlice, slice[index+1:]...) //If the index to be removed was different from the last one, then proceed to copy the following values of the index to the end of the old slice
}
return newSlice
}
通过这种方式,我们能够安全地删除片中的元素,而不管我们将在函数返回时使用什么。
由于我使用了一个函数来回答这个问题,它将是一个好主意处理任何错误如下:
func removeAt(slice []int, index int) ([]int, error) {
if index < 0 {
return nil, fmt.Errorf("index (%d) cannot be a negative number", index)
}
if index >= len(slice) {
return nil, fmt.Errorf("index (%d) cannot be a number greater or equal than the length of slice (%d)", index, len(slice))
}
newSlice := make([]int, 0)
newSlice = append(newSlice, slice[:index]...)
if index != len(slice)-1 {
newSlice = append(newSlice, slice[index+1:]...)
}
return newSlice, nil
}
或者更好的是,实现可以通过接口处理多种类型的函数。
但是,所有这些都是一种很好的实践,因为您构建了一个函数来执行此操作,这与所提出的问题无关。
但是,在这里可以找到一个在围棋操场上测试的例子。