[英]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.