簡體   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