go中将切片项从一个位置移动到另一个位置

时间:2017-04-25 16:52:00

标签: go

我'试图将一个项目从切片内的一个位置移动到另一个位置。 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)

这产生以下输出:

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] 

但我希望输出是这样的:

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] 

我的错在哪里?

2 个答案:

答案 0 :(得分:3)

我之前遇到过同样的问题,并且解决了:

if let startHour = start.hour,
   let startMinute = start.minute {

    dict["start"] = "\(startHour):\(startMinute)"

    if let end = end,
       let endHour = end.hour,
       let endMinute = end.minute {

       dict["end"] = "\(endHour):\(endMinute)"
    }
}

https://play.golang.org/p/Sfu1VsySieS

答案 1 :(得分:2)

问题是slice不是newSlice的独特副本 - 它们引用相同的基础数组。

因此,当您分配到slice时,您正在修改基础数组,因此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) } 也是如此。

要解决此问题,您需要制作一份明确的副本:

Playground

val

(请注意,我还添加了1变量,而不是硬编码{{1}}作为要插入的值。)