首页 文章

切片的通用remove()函数

提问于
浏览
1

我有3个切片(foos,bars,bazs),每个切片都填充了不同类型的结构 . 为了删除一些样板代码,我想创建一个通用的 remove(slice, struct) slice 函数 . 与标准中提供的 append() 相反 .

没有一个结构会成为指针,所以's no need to nil them. I'已经调整了使用 interface{} 获得所需结果无济于事的想法 . 当前实现使用Type Switch,然后使用近似复制粘贴的remove()(下面的playground链接中的示例)从切片中删除 . 随着我继续扩展该项目,它将成长为更多样板 .

正在尝试的示例:https://play.golang.org/p/9UPRIIp5M2

Function input: []slices, struct
Expected output: 
    Modified (removed struct) []slices if struct is found
    Or, Unmodified []slices if it isn't.

如果它简单易行 . 我想象它已经存在于标准中 . 然而,从更多经验丰富的专业人士那里获得建议,如果我试图做的事情甚至是可能的话,从来都不会受到伤害 .

谢谢你的时间 .

2 回答

  • 1

    试图让Go变得通用是新Go开发人员的一大陷阱 . 停止 . 你要保存five of lines of code

    for i := len(foos) - 1; i >= 0; i-- {
        if foos[i] == foo1 {
            foos = append(foos[:i], foos[i+1:]...)
        }
    }
    

    是的,在通用语言中,您可以将这五行包装到一个不错的stdlib方法中,但Go不是通用语言 . 尝试用反射来做这件事很慢,但是很难做到这一点 . 你花费更多的时间找出 Value 并追逐奇怪的角落情况,而不是花费12次重写这五行代码(包括修复你不小心剪掉/粘贴错误的时间,有一次你搞砸了 i-- ) . 写下来吧 .

    只需编写代码,您就可以决定平等意味着什么 . 它允许您决定是在第一场比赛中停止搜索,还是继续浏览整个列表 . 它可以让你完成这个程序所需要的东西,而不是专注于某些通用程序有朝一日可能需要的东西 .

    我喜欢通用编程 . 几乎没有什么比在Haskell中创造优雅的折叠更让我开心 . 但这不是Go的方式 . 在Go中,您通常只需编写代码,保持简单明了,然后继续 .

    Andy提出了一个很好的观点,如果你必须做很多事情, list 可能是一个更好的数据结构 . 而且我经常发现当我有三种类型似乎都有并行方法时,事实证明它们应该都是单个结构的一部分(你真的需要单独的列表吗?)但无论如何,请保持远离反思除非你有一个非常专业的问题你真正的意思"anything"而不是"one of these short list of things."

    (值得注意的是你召唤 append() . 我不能在Go中写 append() . 在Go中工作的's why it had to be part of the language rather than a stdlib function. When I started working in Go, I took that as a significant flaw in the language. The longer I',我发现它不是那么重要 . 你只需编写代码然后继续 . )

  • 3

    我查看了您的示例代码及其错误 . 要了解有关 interface slice 的更多信息,请参阅此Go wikiSliceTricks .


    通用实现有点复杂,您可以使用基于类型的实现 . 但是,基于类型的实现会在样板/重复上带来更多代码 .

    你需要使用reflect包作为评论中提到的@ stephen-weinberg .

    所以最好的出发点是;试试这个库github.com/anzhihun/generic并浏览库代码库,自己实现 . 该库使用反射 .

相关问题