回答

收藏

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

技术问答 技术问答 294 人阅读 | 0 人回复 | 2023-09-12

    . y- m5 i' a0 Y5 [: m* Y; J
  • fmt.Println("Enter position to delete::")fmt.Scanln(&pos)new_arr := make([]int,(len(arr) - 1))k := 0for i := 0; i 我正在使用这个命令从 Slice 删除元素,但不起作用,请提出建议。  b* Z  x- V3 Z" H3 {6 \
  •                                                                - o; f) P7 U$ y5 d, G# |
  •     解决方案:                                                               $ w4 k; x$ Q" n& P; Z: p
  •                                                                 订单事项
    , G7 \7 E* J6 I! Y
  • 如果要保持数组有序,请将删除索引右侧的所有元素向左移动。希望这能在 Golang 轻松完成:[code]func remove(slice []int,s int) []int    return append(slice[:s],slice[s 1:]...)}
    4 N: O* {  i- q5 t. H+ d' y/ S
但这是低效的,因为你最终可能会移动所有的元素,这是昂贵的。
3 @& i7 G( F. x' }% v顺序不重要
5 E8 L! W# e4 ]- f如果不关心排名,可以更快地将要删除的元素替换为切片末尾的元素,然后返回 n-1 第一个元素:8 Q, h+ d6 R& }0 p$ G3 B
    func remove(s []int,i int) []int    s = s[len(s)-1]    return s[:len(s)-1]}; ^/ T' l$ X9 k( O4 a
使用重新切片的方法,需要224秒才能清空 1000 00 元素的数组,而这只需要 0.06 ns。5 C/ P& N; _. ]( W' q! N
答案不执行边界检查。它需要一个有效的索引作为输入。这意味着负值或索引大于或等于初始值len(s)将导致 Go 恐慌。
2 G. \' `* f6 \4 c# e- S切片和数组是 0 索引,删除数组的第 n 个元素意味着提供输入n-1。删除第一个元素,请调用remove(s,0),删除第二个元素,请调用remove(s,1),依此类推。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则