Я ищу сравнить полученные заголовки запросов 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
}
Что не «элегантно» на петле? В настоящее время ли циклы плохой практики в CS? – Volker
@ Волькер проклинал их детей с их причудливыми непринужденными путями, DAMN THEM. – OneOfOne
Volker и @OneOfOne: Я добавил свое решение к моему оригинальному вопросу. Хотя может быть намного лучший способ закодировать его в Go, то, что я закончил, не кажется мне элегантным. Но потом, возможно, я потратил слишком много времени на «батареи включены» языки ... – Pablosan