在对象切片内搜索键 属性 的简洁 Golang 方法
Concise Golang way to search key property within slice of an object
我创建了 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.Name
和 Permission.URN
是 string
个唯一键。
Golang有没有一种简洁的方法,使用函数指针什么的,只使用一个函数而不是3个containsRole()
,containsWorkflow()
,和containsPermission()
并减少重复?
在仿制药到来之前,这些是最干净、最有效的解决方案。
The properties of structs: Role.Name
, SuperWorkflow.Workflow.Name
and Permission.URN
are string
unique keys.
您可以按唯一键对切片进行排序,因此在查找元素时可以使用二进制搜索,请参阅 sort.Search()
。
您也可以将它们存储在映射中,从唯一键映射,并且 contains
操作变成一个简单的映射索引,例如!containsRole()
将是:
if _, ok := roles[x]; !ok {
// there is no role with Name == x
}
与您的顺序搜索算法相比,此地图查找在速度上将更胜一筹,并且很可能也会击败二进制搜索。
(你当然不必为它添加一个函数,只需在你需要知道其中是否包含 x
的地方索引地图。)
我创建了 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.Name
和 Permission.URN
是 string
个唯一键。
Golang有没有一种简洁的方法,使用函数指针什么的,只使用一个函数而不是3个containsRole()
,containsWorkflow()
,和containsPermission()
并减少重复?
在仿制药到来之前,这些是最干净、最有效的解决方案。
The properties of structs:
Role.Name
,SuperWorkflow.Workflow.Name
andPermission.URN
arestring
unique keys.
您可以按唯一键对切片进行排序,因此在查找元素时可以使用二进制搜索,请参阅 sort.Search()
。
您也可以将它们存储在映射中,从唯一键映射,并且 contains
操作变成一个简单的映射索引,例如!containsRole()
将是:
if _, ok := roles[x]; !ok {
// there is no role with Name == x
}
与您的顺序搜索算法相比,此地图查找在速度上将更胜一筹,并且很可能也会击败二进制搜索。
(你当然不必为它添加一个函数,只需在你需要知道其中是否包含 x
的地方索引地图。)