2015-06-15 103 views
-2

我有这段代码遍历地图并根据关系类型过滤一些字段,我必须运行两个循环,并且感觉它对大地图来说会很慢。有没有什么办法可以让技术/重构使代码更高效。如何使此代码更高效?

func getFields(filter map[string]map[string]bool, msg *Message) (fs []Field) { 

    for k, _ := range filter { 
     if relationString(msg) == k { 
      if fieldFilter, ok := filter[k]; ok { 
       for _, f := range msg.Fields { 
        if _, ok := fieldFilter[f.Name]; ok { 
         fs = append(fs, f) 
        } 
       } 
      } 
     } 
    } 
    return 
} 
+1

如果仅仅是为了便于阅读我会分解出深度嵌套语句。如果你担心性能,*基准*。 (接口与这个有什么关系?) – JimB

+0

哦,我搞砸了两个想法,接口的想法是关于我用这个代码做的其他事情,道歉。 – Varun

回答

1

你不需要外循环为一体的改进:

func getFields(filter map[string]map[string]bool, msg *Message) (fs []Field) { 
    if fieldFilter, ok := filter[relationString(msg)]; ok { 
    for _, f := range msg.Fields { 
     if _, ok := fieldFilter[f.Name]; ok { 
      fs = append(fs, f) 
     } 
     } 
    } 
    } 

    return 
}