就地删除Golang切片元素

危害

我想就地从集合中删除元素。考虑以下代码段:

package main

import "fmt"

type Ints []int

func (xs Ints) Filter() {
    for i := 0; i < len(xs); i++ {
        if xs[i]%2 == 0 { // Or some other filtering function
             xs = append(xs[:i], xs[i+1:]...)
        }
        fmt.Printf("i %+v\n", i)
        fmt.Printf("xs %+v\n", xs)
    }
}

func main() {
    a := Ints([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})

    fmt.Printf("initial a %+v\n", a)

    a.Filter()

    fmt.Printf("final a %+v\n", a)
}

http://play.golang.org/p/1nL6Il2Gf1

令人惊讶的结果是: final a [1 3 5 7 9 10 10 10 10 10]

我不知道该怎么做。我很确定接收者需要指向Ints但这会使代码有些混乱(*xs可能在所有位置加上方括号),但更重要的是它会产生相同的结果。

Not_a_Golfer

我可以通过移动元素,然后调整切片的大小并使用指针来实现。像这样:

package main

import "fmt"

type Ints []int

func (xs *Ints) Filter() {
    filterPos := 0
    for i := 0; i < len(*xs); i++ {
        if (*xs)[i]%2 == 0 { // Or some other filtering function
             (*xs)[filterPos] = (*xs)[i]
         filterPos++
        }
    }
    (*xs) = (*xs)[:filterPos]
}

func main() {
    a := Ints([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})

    fmt.Printf("initial a %+v\n", a)

    a.Filter()

    fmt.Printf("final a %+v\n", a)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

切片的就地修改

来自分类Dev

切片golang切片

来自分类Dev

就地更改2D切片

来自分类Dev

具有重叠切片的 NumPy 就地操作

来自分类Dev

Golang:提高切片性能

来自分类Dev

Golang不能超出切片的指针

来自分类Dev

Golang:获取切片的类型

来自分类Dev

Golang切片追加与分配性能

来自分类Dev

检查golang中的切片类型

来自分类Dev

Golang中的常规切片类型?

来自分类Dev

Golang抽象接口切片转换

来自分类Dev

切片元素未更新

来自分类Dev

元素后的Laravel切片集合

来自分类Dev

切片不要删除我的对象

来自分类Dev

删除线图切片的命令

来自分类Dev

删除切片中的元素

来自分类Dev

无法使用Golang交换2D阵列切片的元素

来自分类Dev

比较两个切片并删除Golang中的唯一值

来自分类Dev

将struct属性(切片)传递给从中删除元素的函数时的奇怪行为

来自分类Dev

golang切片,用slice切片[a:b:c]

来自分类Dev

Golang:使用切片策略的切片的多维数组导致奇怪的输出

来自分类Dev

如何在Python列表中的特定元素之后删除列表中的元素(切片不适用)

来自分类Dev

Golang:结构切片之间的类型转换

来自分类Dev

Golang:如何按星期几对切片进行排序?

来自分类Dev

Golang append()何时创建新切片?

来自分类Dev

Golang:切片和填充字节数组

来自分类Dev

Golang:范围通过切片并生成HTML表

来自分类Dev

从golang中的json文件中读取切片

来自分类Dev

Golang-嵌套结构中的切片