I' trying to move an item from one position to another inside a slice. Go Playground
indexToRemove := 1
indexWhereToInsert := 4
slice := []int{0,1,2,3,4,5,6,7,8,9}
slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...)
fmt.Println("slice:", slice)
newSlice := append(slice[:indexWhereToInsert], 1)
fmt.Println("newSlice:", newSlice)
slice = append(newSlice, slice[indexWhereToInsert:]...)
fmt.Println("slice:", slice)
This produces to following output:
slice: [0 2 3 4 5 6 7 8 9]
newSlice: [0 2 3 4 1]
slice: [0 2 3 4 1 1 6 7 8 9]
But I would expect the output be like this:
slice: [0 2 3 4 5 6 7 8 9]
newSlice: [0 2 3 4 1]
slice: [0 2 3 4 1 **5** 6 7 8 9]
Where is my fault?
The problem is that newSlice
is not a distinct copy of slice
--they reference the same underlying array.
So when you assign to newSlice
, you're modifying the underlying array, and thus slice
, too.
To remedy this, you need to make an explicit copy:
package main
import (
"fmt"
)
func main() {
indexToRemove := 1
indexWhereToInsert := 4
slice := []int{0,1,2,3,4,5,6,7,8,9}
val := slice[indexToRemove]
slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...)
fmt.Println("slice:", slice)
newSlice := make([]int, indexWhereToInsert+1)
copy(newSlice,slice[:indexWhereToInsert])
newSlice[indexWhereToInsert]=val
fmt.Println("newSlice:", newSlice)
fmt.Println("slice:", slice)
slice = append(newSlice, slice[indexWhereToInsert:]...)
fmt.Println("slice:", slice)
}
(Note that I've also added the val
variable, rather than hardcoding 1
as the value to be inserted.)