function - 在对象 slice 内搜索关键属性的简洁 Golang 方式

标签 function go slice function-pointers functor

我创建了 3 个搜索功能:

func containsRole(x string, a []Role) bool {
    for _, n := range a {
        if x == n.Name {
            return true
        }
    }
    return false
}
func containsWorkflow(x string, a []SuperWorkflow) bool {
    for _, n := range a {
        if x == n.Workflow.Name {
            return true
        }
    }
    return false
}
func containsPermission(x string, a []Permission) bool {
    for _, n := range a {
        if x == n.URN {
            return true
        }
    }
    return false
}

我在其他 3 个不同的函数中循环调用它们,例如:

// In function 1
for _, leftRole := range leftRoles {
    if !containsRole(leftRole.Name, rightRoles) {
        createRoleReport(leftRole))
    }
}
// In function 2
for _, leftWF := range leftWorkflows {
    if !containsWorkflow(leftWF.Workflow.Name, rightWorkflows) {
        createWorkflowReport(leftWF)
    }
}
// In function 3
for _, leftPerm := range leftPermissions {
    if !containsPermission(leftPerm.URN, rightPermissions) {
        createPermissionReport(leftPerm)
    }
}

结构体的属性:Role.Name , SuperWorkflow.Workflow.NamePermission.URNstring唯一键。
Golang中是否有一种简洁的方法,使用函数指针什么的,只使用一个函数而不是3 containsRole() , containsWorkflow() , 和 containsPermission()并减少重复?

最佳答案

在泛型出现之前,这些是最干净、最有效的解决方案。

The properties of structs: Role.Name, SuperWorkflow.Workflow.Name and Permission.URN are string unique keys.



您可以按唯一键对 slice 进行排序,因此您可以在查找元素时使用二分搜索,请参阅 sort.Search() .

您也可以将它们存储在从唯一键映射的映射中,以及 contains操作变成一个简单的 map 索引,例如!containsRole()将是:
if _, ok := roles[x]; !ok {
    // there is no role with Name == x
}

与您的顺序搜索算法相比,这种 map 查找的速度会更快,并且很可能也会击败二分搜索。

(当然,您不必为其添加函数,只需在需要知道其中是否包含 x 的 map 的位置建立索引即可。)

关于function - 在对象 slice 内搜索关键属性的简洁 Golang 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59844435/

相关文章:

java - Callabe 语句 Oracle Update Skip 锁定获取无序错误

json - 无法将 []interface{} 转换为 []byte : "interface {} is []interface [], not []uint8"

Python:从字符串元组中获取第一个元素

struct - 引用子结构数组的 Golang 问题

pointers - 变量中的 slice 指针在追加期间更改行为

python - 了解 Python 函数

javascript - 在 Javascript 中使用 new Date() 测量时间的问题

postgresql - 如何使用 sqlx 扫描嵌套结构?

javascript - 如何编写 jQuery/JS 函数以使其返回值?

go - 如何为一元 rpc 定义响应 header