繁体   English   中英

根据 Golang 中的不同切片过滤结构切片

[英]Filtering a slice of structs based on a different slice in Golang

在下面的示例代码中,我有几个用户manySimpleUsers ,我想从删除manyFullUsers基于用户名。

如果我使用嵌套的几个for... range循环来执行此操作,则将需要许多循环来过滤所有元素,尤其是当两个 Slices 中都有大量元素时。

在 Go 中实现这一目标的最佳方法是什么?

package main

import "fmt"

func main() {
    fmt.Println("Hello, playground")

    type FullUser struct {
        UserName  string
        UserEmail string
    }

    manyFullUsers := []FullUser{{"foo", "foo@jawohl.com"},
        {"bar", "bar@jawohl.com"},
        {"baz", "baz@jawohl.com"}}

    type SimpleUser struct {
        UserName string
    }

    manySimpleUsers := []SimpleUser{{"foo"}, {"bar"}}

    fmt.Println(manyFullUsers)
    fmt.Println(manySimpleUsers)
}

创建地图,然后使用它进行过滤。

func filterByUserName(fu []FullUser, su []SimpleUser) (out []FullUser) {
    f := make(map[string]struct{}, len(su))
    for _, u := range su {
        f[u.UserName] = struct{}{}
    }
    for _, u := range fu {
        if _, ok := f[u.UserName]; ok {
            out = append(out, u)
        }
    }
    return
}

操场

您可以使用来自https://github.com/ledongthuc/goterators 的Filter() 和 Exist()

在此处输入图片说明

    filteredFullUsers := goterators.Filter(manyFullUsers, func(item FullUser) bool {
        return !goterators.Exist(manySimpleUsers, SimpleUser{item.UserName})
    })

您还可以从 manySimpleUsers 构建一个地图,这将有助于优化搜索用户名。

这个库需要 Go 1.18 来使用你想要使用的支持泛型 + 动态类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM