fmt.Println("Enter position to delete::")
fmt.Scanln(&pos)
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++
i++
} else {
k++
}
}
for i := 0; i < (len(arr) - 1); i++ {
fmt.Println(new_arr[i])
}
我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。
从切片包中使用Delete(实验性的,从Go 1.18开始可用):
slice := []int{1, 2, 3, 4}
slice = slices.Delete(slice, 1, 2)
fmt.Println(slice) // [1 3 4]
去游乐场的例子
片。Delete(s, i, j)从s中删除元素s[i:j]
即从索引I到索引j的元素
如果你还记得区间的数学符号:[i,j)
注意两点:
Delete修改原始片的内容
你需要重新分配切片,否则它会有错误的长度
你需要稍微修改一下你的代码,
new_arr := make([]int, (len(arr) - 1))
for i := 0; i < len(arr); i++ {
if i != pos {
new_arr = append(new_arr, arr[i])
}
}
为了更有效的循环,你可以使用这个
for i, item := range arr {
...
}
最后,您可以通过使用本机切片功能来实现这一点
new_arr = append(arr[:2], arr[3:])
最后一个解决方案是删除索引2中的元素,并将新切片放在new_arr中。
顺序很重要
如果你想要保持数组的有序,你必须将删除索引右边的所有元素向左移动一个单位。希望在Golang中可以轻松做到这一点:
func remove(slice []int, s int) []int {
return append(slice[:s], slice[s+1:]...)
}
然而,这是低效的,因为您可能最终要移动所有的元素,这是昂贵的。
顺序并不重要
如果你不关心顺序,你可以更快地将要删除的元素替换为片末尾的元素,然后返回第n-1个元素:
func remove(s []int, i int) []int {
s[i] = s[len(s)-1]
return s[:len(s)-1]
}
使用reslicing方法,清空一个包含100万个元素的数组需要224秒,而这个方法只需要0.06ns。
这个答案不执行边界检查。它需要一个有效的索引作为输入。这意味着大于或等于初始len(s)的负值或下标将导致Go panic。
切片和数组是0索引,删除数组的第n个元素意味着提供输入n-1。要删除第一个元素,调用remove(s, 0),要删除第二个元素,调用remove(s, 1),依此类推。
找到一条不需要搬迁的路。
更改订单
a := []string{"A", "B", "C", "D", "E"}
i := 2
// Remove the element at index i from a.
a[i] = a[len(a)-1] // Copy last element to index i.
a[len(a)-1] = "" // Erase last element (write zero value).
a = a[:len(a)-1] // Truncate slice.
fmt.Println(a) // [A B E D]
维持秩序
a := []string{"A", "B", "C", "D", "E"}
i := 2
// Remove the element at index i from a.
copy(a[i:], a[i+1:]) // Shift a[i+1:] left one index.
a[len(a)-1] = "" // Erase last element (write zero value).
a = a[:len(a)-1] // Truncate slice.
fmt.Println(a) // [A B D E]