我试图在一个切片中将一个项目从一个位置移动到另一个位置。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]
型
我的错在哪里?
4条答案
按热度按时间5vf7fwbs1#
我以前遇到过同样的问题,我解决了:
字符串
https://play.golang.org/p/Sfu1VsySieS
klh5stk12#
问题是
newSlice
不是slice
的不同副本--它们引用相同的底层数组。因此,当你赋值给
newSlice
时,你修改了底层数组,因此也修改了slice
。要解决这个问题,您需要创建一个显式副本:
Playground
字符串
(Note我还添加了
val
变量,而不是将1
硬编码为要插入的值。w6lpcovy3#
这里有一个简单的右移例子,没有复制,但也包括一个循环,显示它是如何真正的指针。
Playground
字符串
zbdgwd5y4#
如果你需要omotto的泛型版本:
字符串