如何从 Golang 中的 Slice 中删除一个元素

新手上路,请多包涵
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])
}

我正在使用此命令从 Slice 中删除一个元素,但它不起作用,请提出建议。

原文由 Anchal Sarraf 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.8k
1 个回答

订单事宜

如果要保持数组有序,则必须将删除索引右侧的所有元素向左移动一位。希望这可以在 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 方法,清空 1 000 000 个元素的数组需要 224 秒,而这个只需要 0.06 纳秒。

这个答案不执行 bounds-checking 。它需要一个有效的索引作为输入。这意味着大于或等于初始 len(s) 的负值或索引将导致 Go 崩溃。

切片和数组是 0 索引的,删除数组的第 n 个元素意味着提供输入 n-1 。要删除第一个元素,请调用 remove(s, 0) ,要删除第二个元素,请调用 remove(s, 1) ,依此类推。

原文由 T. Claverie 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题