登录
首页 >  Golang >  Go问答

使用 Golang 在对象切片中查找关键属性的方法

来源:stackoverflow

时间:2024-03-11 23:42:28 417浏览 收藏

今天golang学习网给大家带来了《使用 Golang 在对象切片中查找关键属性的方法》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我创建了 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.namesuperworkflow.workflow.namepermission.urnstring 唯一键。

golang中有没有一种简洁的方法,使用函数指针或其他东西,只使用一个函数而不是3个containsrole()containsworkflow()containspermission()并减少重复?


解决方案


在仿制药到来之前,这些是最干净、最有效的解决方案。

结构体的属性:role.namesuperworkflow.workflow.namepermission.urnstring 唯一键。

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

您还可以将它们存储在映射中,从唯一键映射,并且 contains 操作变成简单的映射索引,例如!containsrole() 将是:

if _, ok := roles[x]; !ok {
    // there is no role with Name == x
}

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

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

终于介绍完啦!小伙伴们,这篇关于《使用 Golang 在对象切片中查找关键属性的方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>