2014-09-04 2 views
1

Я ищу сравнить полученные заголовки запросов HTTP с картой ожидаемых заголовков хранятся как часть структуры:golang карты сравнение: частичное совпадение

type Request struct { 
    URI string 
    Method string 
    Headers map[string]interface{} 
} 

мне нужно, чтобы убедиться, что заголовки определены в struct существуют во входящем запросе. Мне все равно, есть ли дополнительные заголовки, которых я не ожидал, но все заголовки, хранящиеся в структуре, должны присутствовать.

Есть ли соглашение о голанге для определения того, существуют ли все элементы на карте на другой карте? Некоторые примеры данных:

{ 
    "expected_headers": { 
    "Content-Type": ["application/json"], 
    "Accept-Encoding": ["gzip, deflate"] 
    }, 
    "received_headers": { 
    "Content-Type": ["application/json"], 
    "Accept-Encoding": ["gzip, deflate"], 
    "Accept": ["application/json"] 
} 

Это положительный пример: то есть результат тестирования, если ожидаемые заголовки присутствуют в полученных заголовках должен быть правдой.

Я знаю, что я мог бы перебирать множество ожидаемых_годов и искать каждый из них в received_headers. Тем не менее, я надеюсь, что есть более элегантный способ сделать то же самое.


Основываясь на комментариях, я добавил свое решение. Я свободно признаю, что я новичок в Go (хотя я десятилетиями кодировал на разных языках). Мое решение не кажется мне элегантным. Лучшие решения приветствуются!

func contains(theSlice []string, theValue string) bool { 
    for _, value := range theSlice { 
     if value == theValue { 
      return true 
     } 
    } 
    return false 
} 

func slicesMatch(slice1 []string, slice2 []string) bool { 
    for _, value := range slice1 { 
     if !(contains(slice2, value)) { 
      return false 
     } 
    } 
    return true 
} 

func headersMatch(expected map[string][]string, actual http.Header) bool { 
    for key, value := range expected { 
     if !(slicesMatch(value, actual[key])) { 
      return false 
     } 
    } 
    return true 
} 
+4

Что не «элегантно» на петле? В настоящее время ли циклы плохой практики в CS? – Volker

+0

@ Волькер проклинал их детей с их причудливыми непринужденными путями, DAMN THEM. – OneOfOne

+0

Volker и @OneOfOne: Я добавил свое решение к моему оригинальному вопросу. Хотя может быть намного лучший способ закодировать его в Go, то, что я закончил, не кажется мне элегантным. Но потом, возможно, я потратил слишком много времени на «батареи включены» языки ... – Pablosan

ответ

4

Есть ли golang конвенции для определения, существуют ли все элементы карты в другую карту?

Нет, не существует. Вам придется циклически и проверять один за раз.

Смежные вопросы