2017-03-08 42 views
0

這裏是我需要做的,並不能找到我需要爲了做到這一點的資源:golang解組結構函數,它不知道的類型,並依靠接口

我需要編寫一個通用函數將爲MOCK服務器設置處理程序。這個處理程序將接收一個JSON對象,並且必須取消它並將其與參考結構進行比較,並根據兩個對象之間的對應關係來相應地設置其狀態。 這裏有個訣竅:我們不知道函數內部是什麼類型的引用。

< =====我現在在哪裏====> 我寫了這個函數,不起作用。

func createHandlerToTestDelete(route string, ref interface{}, received interface{}){ 
    Servmux.HandleFunc(route, 
     func(w http.ResponseWriter, r *http.Request) { 
      // recreate a structure from body content 
      body, _ := ioutil.ReadAll(r.Body) 
      json.Unmarshal(body, &received) 

      // comparison between ref and received 
      if reflect.DeepEqual(received, ref) { 
       w.WriteHeader(http.StatusOK) 
      } else { 
       w.WriteHeader(http.StatusInternalServerError) 
      } 
     }, 
    ) 
} 

這裏是我如何使用它:

ref := MyStruct{...NotEmpty...} 
received := MyStruct{} 
createHandlerToTestDelete("aRoute", ref, received) 

結果是服務器時做解組不會在意原始類型接收可變的。

有人有想法嗎?

回答

1

使用reflect.New創建一個指向與引用類型具有相同類型的值的指針。

func createHandlerToTestDelete(route string, ref interface{}) { 
    t := reflect.TypeOf(ref) 
    ServeMux.HandleFunc(route, 
    func(w http.ResponseWriter, r *http.Request) { 
     v := reflect.New(t) 
     if err := json.NewDecoder(r.Body).Decode(v.Interface()); err != nil { 
      // handle error 
     } 
     // v is pointer to value. Get element for correct comparison. 
     if reflect.DeepEqual(v.Elem().Interface(), ref) { 
      w.WriteHeader(http.StatusOK) 
     } else { 
      w.WriteHeader(http.StatusInternalServerError) 
     } 
    }, 
) 
} 
+0

非常感謝,好像我應該去看看反射和json的內容更好看! – MrBouh

相關問題