2015-06-15 2 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

я вынесу глубоко вложенные заявления, если только для удобства чтения. Если вас беспокоит производительность, * benchmark *. (Что с этим связаны интерфейсы?) – 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 
}