我有一个像map [string] [] string的结构图。现在我必须找到在值切片中具有所需值的所有键。我可以这样做:
// allsvc is map[string][]string
var newsl []string
for k, v := range allsvc {
for _, val := range v {
if v == "type1" || v == "type2" {
newsl.append(k)
}
}
}
地图allsvc在任何给定时间至少有五十万个条目,并且查找非常频繁。我将allsvc地图作为第三方库的输出,然后我必须使用我的api中的值进行搜索并提供响应。鉴于查找的频率很高,不使用键但是使用值,我这样做的方式使我的api响应时间在几秒钟内。有没有办法提高性能(查找速度)?
答案 0 :(得分:2)
如果您要多次查询该地图,可能需要花一些时间重新安排它,以便您可以更快地查询它。
似乎你需要反转关系,使allsvc
中的值成为新地图中的键,并将键作为值,这样你就可以在新地图中进行查找。
这可以是重新安排地图的方法:
func arrangeMap(oldMap map[string][]string) map[string][]string {
newMap := make(map[string][]string)
for k, v := range oldMap {
for _, val := range v {
newMap[val] = append(newMap[val], k)
}
}
return newMap
}
在这里看到一个展示这个想法的游乐场: