5
我有一個非常簡單的Go web服務器。接收入站json負載是工作。然後它將有效負載發佈到一個或多個需要字節數組的服務。有效載荷不需要檢查。剛剛發過來。將io.ReadCloser轉換爲字節數組的最有效方法
在這種情況下,它會接收入站作業並將其發送到Google PubSub。這可能是另一項服務 - 它並不重要。 我試圖找到最有效的方法來將對象轉換爲字節數組,而無需先解碼它。
爲什麼?在一臺服務器上解碼並轉換爲JSON似乎有點浪費,只能稍後解組。另外,我不想在兩個包中保留兩個相同的結構。
如何將io.ReadCloser轉換爲字節數組,所以我只需要解組一次。我想是這樣的答案,但不認爲這是最有效的方法之一:
From io.Reader to string in Go
我的HTTP服務器的代碼如下所示:您轉換讀者字節
func Collect(d DbManager) http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
code := 422
obj := Report{}
response := Response{}
response.Message = "Invalid request"
decoder := json.NewDecoder(r.Body)
decoder.Decode(&obj)
if obj.Device.MachineType != "" {
msg,_ := json.Marshal(obj)
if d.Publish(msg, *Topic) {
code = 200
}
response.Message = "Ok"
}
a, _ := json.Marshal(response)
w.WriteHeader(code)
w.Write(a)
return
})
}
酷,我已經試過了,但它輸出空...我還沒有意識到,試圖在解碼之後這麼做會這樣做。兩個經驗教訓,歡呼大耳朵。 –
記住'io.Copy'是分配的,這是一個好主意。你可能會想在熱路徑中使用'io.CopyBuffer'。 –
@AmmarBandukwala,除非你已經有一個緩衝區,它們是相同的,複製只是調用CoffyBuffer。您需要在某個時間點進行分配,並且在std lib http請求的方案中,它是許多此類分配中的一個,並且可能不重要。 – JimB