go - 根据 Golang 中的不同 slice 过滤结构 slice

标签 go

在下面的示例代码中,我想根据用户名从 manyFullUsers 中删除 manySimpleUsers 中的一些用户。

如果我用一对嵌套的 for...range 循环来完成,将需要很多循环来过滤所有元素,尤其是当两个 slice 中都有大量元素时.

在 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)
}

最佳答案

创建 map 然后使用它进行过滤。

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
}

playground

关于go - 根据 Golang 中的不同 slice 过滤结构 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32867780/

相关文章:

mysql - 如何解决mysqldump Got error : 1044: "Access denied for user ' ' @'localhost' to database 'db_name' "when selecting the database

go - 如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?

go - 使用 codegangsta/cli 捕获命令标志变量

go - 想要使用 channel 从 os.Stdin 写入 os.Stdout

mysql - 如何解析MySQL错误

exception - Go vs. 中的 panic recover try catch 用其他语言

c - 去 1.5+ : Error - imports runtime: C source files not allowed when not using cgo or SWIG

go - 创建路由模块 Go/Echo RestAPI

arrays - 如何在结构中附加 slice

戈朗 : Type Assertion Error issue