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