看到这有点奇怪,但是这里的大多数答案都是危险的,掩盖了他们实际所做的事情。查看最初提出的有关从切片中删除项目的问题,正在制作切片的副本,然后将其填充。这样可以确保在将切片传递到您的程序时不会引入细微的错误。
这是一些代码,用于比较用户在该线程中的答案和原始帖子。这是一个去操场这个代码的。
基于附加的删除
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
在上面的示例中,您可以看到我创建了一个切片并将其手动填充为数字0到9。然后从所有索引中删除索引5,然后将其分配为删除索引。但是,当我们现在打印所有内容时,我们会看到它也已被修改。这是因为切片是指向基础数组的指针。将其写成removeIndex
原因all
也会被修改,区别all
是从不再可以到达一个元素removeIndex
。接下来,我们在中更改一个值removeIndex
,我们还可以看到all
被修改了。关于这一点的有效细节。
下面的示例我不会涉及,但出于我们的目的,它会做同样的事情。只是说明使用复制没有什么不同。
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
问题原答案
查看原始问题,它不会修改要从中删除项目的切片。对于大多数访问此页面的人来说,使此主题中的原始答案到目前为止是最好的。
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
如您所见,此输出的行为符合大多数人的期望,也可能是大多数人想要的。修改originalRemove
不会导致更改all
,删除索引和为其分配索引的操作也不会导致更改!太棒了!
这段代码有点冗长,因此上面的内容可以更改为此代码。
正确答案
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
与原始的删除索引解决方案几乎相同,但是在返回之前,我们要添加一个新的切片。