Map golang地图比较:部分匹配

Map golang地图比较:部分匹配,map,go,comparison,Map,Go,Comparison,我希望将收到的HTTP请求头与作为结构的一部分存储的预期头的映射进行比较: type Request struct { URI string Method string Headers map[string]interface{} } 我需要确保结构中定义的头存在于传入请求中。我不在乎是否有我不期望的额外头,但是存储在结构中的所有头都必须存在 是否存在确定地图中所有项目是否存在于其他地图中的golang约定?一些示例数据: { "expected_header

我希望将收到的HTTP请求头与作为结构的一部分存储的预期头的映射进行比较:

type Request struct {
    URI    string
    Method string
    Headers map[string]interface{}
}
我需要确保结构中定义的头存在于传入请求中。我不在乎是否有我不期望的额外头,但是存储在结构中的所有头都必须存在

是否存在确定地图中所有项目是否存在于其他地图中的golang约定?一些示例数据:

{
  "expected_headers": {
    "Content-Type": ["application/json"],
    "Accept-Encoding": ["gzip, deflate"]
  },
  "received_headers": {
    "Content-Type": ["application/json"],
    "Accept-Encoding": ["gzip, deflate"],
    "Accept": ["application/json"]
}
这是一个积极的例子:即,测试接收到的报头中是否存在预期的报头的结果应该是真的

我知道我可以在预期的_头集合上循环,并在收到的_头中查找每一个。然而,我希望有一个更优雅的方式来完成同样的事情

根据这些评论,我添加了我的解决方案。我坦率地承认我是一个全新的人,尽管我已经用许多不同的语言编写代码几十年了。我的解决方案在我看来并不优雅。欢迎提供更好的解决方案

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
}
是否存在确定地图中所有项目是否存在于其他地图中的golang约定

不,没有。您必须一次循环并检查一个

是否存在确定地图中所有项目是否存在于其他地图中的golang约定


不,没有。您必须一次循环并检查一个。

循环中有什么不优雅?“循环是不是现在CS中的坏习惯?”沃尔克用他们奇特的非循环方式诅咒他们,诅咒他们。沃尔克和@OneOfOne:我把我的解决方案添加到了我原来的问题中。虽然可能有更好的方法将其编码到Go中,但我最终得到的结果在我看来并不优雅。但也许我在电池和语言上花了太多时间…@user3408000开玩笑,这是惯用的方法,其他任何东西都只是合成糖在做同样的事情。谢谢!好吧,你知道什么。。。我在正确的轨道上什么是不优雅的循环?“循环是不是现在CS中的坏习惯?”沃尔克用他们奇特的非循环方式诅咒他们,诅咒他们。沃尔克和@OneOfOne:我把我的解决方案添加到了我原来的问题中。虽然可能有更好的方法将其编码到Go中,但我最终得到的结果在我看来并不优雅。但也许我在电池和语言上花了太多时间…@user3408000开玩笑,这是惯用的方法,其他任何东西都只是合成糖在做同样的事情。谢谢!好吧,你知道什么。。。我在正确的轨道上