2016-10-09 108 views
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 
}) 
} 

回答

10

,由閱讀它。有沒有一種更有效的方式來做到這一點。

body, err := ioutil.ReadAll(r.Body) 

如果是無條件從io.Reader轉移字節到io.Writer,你可以只使用io.Copy

+0

酷,我已經試過了,但它輸出空...我還沒有意識到,試圖在解碼之後這麼做會這樣做。兩個經驗教訓,歡呼大耳朵。 –

+0

記住'io.Copy'是分配的,這是一個好主意。你可能會想在熱路徑中使用'io.CopyBuffer'。 –

+1

@AmmarBandukwala,除非你已經有一個緩衝區,它們是相同的,複製只是調用CoffyBuffer。您需要在某個時間點進行分配,並且在std lib http請求的方案中,它是許多此類分配中的一個,並且可能不重要。 – JimB

相關問題