在golang中查找和删除切片中的元素

时间:2018-01-06 00:33:51

标签: go slice

我有一些像[1, -13, 9, 6, -21, 125]这样的数字。我想找到小于零的元素然后删除它们。

可以通过简单的方式完成: 只是迭代切片,如果元素小于零 - >删除它。但由于每一步都可能发生切片变化,因此计算成本很高。

有没有像numpy.where(array, condition)numpy.delete这样的优雅方式?

1 个答案:

答案 0 :(得分:6)

将幸存的元素复制到切片的开头,并在完成后重新复制。

p := []int{1, -13, 9, 6, -21, 125}
j := 0

for _, n := range p {
    if n >= 0 {
        p[j] = n
        j++
    }
}
p = p[:j]

未分配内存,但修改了原始切片。如果无法修改原始切片,则分配并复制到新切片:

p := []int{1, -13, 9, 6, -21, 125}
j := 0
q := make([]int, len(p))
for _, n := range p {
    if n >= 0 {
        q[j] = n
        j++
    }
}
q = q[:j] // q is copy with numbers >= 0

playground example