在 Go 中遍历切片通常涉及重新排列其元素。尝试直接将项目从一个位置移动到另一个位置可能会导致意外结果,如提供的代码片段所示:
slice := []int{0,1,2,3,4,5,6,7,8,9}
indexToRemove := 1
indexWhereToInsert := 4
slice = append(slice[:indexToRemove], slice[indexToRemove 1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)
此方法旨在将 indexToRemove 处的项目移动到 indexWhereToInsert,但输出显示移动项目的两个副本。错误在于删除和插入项目的方式。让我们探索另一种方法:
利用自定义函数进行项目操作
我们可以创建用于插入和删除的专用函数,而不是手动修改切片:
func insertInt(array []int, value int, index int) []int {
return append(array[:index], append([]int{value}, array[index:]...)...)
}
func removeInt(array []int, index int) []int {
return append(array[:index], array[index 1:]...)
}
精确移动项目
使用这些辅助函数,移动项目非常简单:
func moveInt(array []int, srcIndex int, dstIndex int) []int {
value := array[srcIndex]
return insertInt(removeInt(array, srcIndex), value, dstIndex)
}
示例实现和输出
func main() {
slice := []int{0,1,2,3,4,5,6,7,8,9}
fmt.Println("Original slice:", slice)
slice = insertInt(slice, 2, 5)
fmt.Println("After insertion:", slice)
slice = removeInt(slice, 5)
fmt.Println("After removal:", slice)
slice = moveInt(slice, 1, 4)
fmt.Println("After moving:", slice)
}
输出:
Original slice: [0 1 2 3 4 5 6 7 8 9] After insertion: [0 1 2 3 4 2 5 6 7 8 9] After removal: [0 1 2 3 4 5 6 7 8 9] After moving: [0 2 1 3 4 5 6 7 8 9]
此方法正确地将索引 1 处的项目移动到索引 4,从而产生预期的输出。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3