2014-09-04 2 views
1

내가 기대 헤더의지도받은 HTTP 요청 헤더를 비교하기 위해 찾고는 구조체의 일부로 저장되고 :golang지도 비교 : 부분 일치

나는 헤더가 정의 있는지 확인해야
type Request struct { 
    URI string 
    Method string 
    Headers map[string]interface{} 
} 

구조체가 들어오는 요청에 존재합니다. 예상하지 못한 추가 헤더가 있는지는 상관하지 않지만 구조체에 저장된 모든 헤더가 있어야합니다.

지도의 모든 항목이 다른지도에 있는지 여부를 결정하는 골란 규칙이 있습니까? 일부 예시적인 데이터 :

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

긍정적 예이다 : 즉, 시험 결과 예상 헤더가 수신 된 헤더에 존재하는 경우에 해당 할 것이다.

나는 expected_headers 세트를 반복하여 각각의 received_headers를 찾을 수 있음을 알고있다. 그러나, 나는 똑같은 일을 성취하기위한보다 우아한 방법이 있기를 바라고 있습니다.


내 의견을 토대로 내 솔루션을 추가했습니다. 나는 내가 새로운 브랜드 인 것을 자유롭게 인정한다 (비록 내가 수십 년 동안 많은 다른 언어로 코딩을 해왔음). 내 솔루션은 나에게 우아하지 않습니다. 더 나은 솔루션을 환영합니다!

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

@Volker 젠장, 그 아이들은 환상적인 비 루핑 방법으로 아이들을 묘사합니다. – OneOfOne

+0

Volker and @OneOfOne : 원래의 질문에 해결책을 추가했습니다. Go에서 코드를 작성하는 것이 더 좋은 방법 일 수 있지만, 내가 결국에는 나에게 우아하지 않은 것입니다. 하지만 어쩌면 나는 "배터리 포함"언어로 너무 많은 시간을 보냈습니다 ... – Pablosan

답변

4

지도의 모든 항목이 다른 맵에 존재하는지 여부를 결정하기위한 golang 규칙이 있습니까?

아니요, 없습니다. 한 번에 하나씩 루프를 만들고 확인해야합니다.