golang地图比较:部分匹配

时间:2014-09-04 16:34:09

标签: map go comparison

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

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

我需要确保结构中定义的Headers存在于传入请求中。我不在乎是否有额外的标题我不期待,但结构中存储的所有标题必须存在。

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

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

这是一个积极的例子:即测试接收标头中是否存在预期标头的结果应为True。

我知道我可以循环遍历expected_headers,并在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
}

1 个答案:

答案 0 :(得分:4)

  

是否有golang约定来确定地图中的所有项目是否都存在于另一个地图中?

不,没有。您将不得不循环并一次检查一个。