将io.ReadCloser转换为字节数组的最有效方法

时间:2016-10-09 16:40:32

标签: json go

我有一个非常简单的Go网络服务器。它的工作是接收入站json有效负载。然后,它将有效负载发布到一个或多个期望字节数组的服务。无需检查有效负载。刚发过来。

在这种情况下,它会收到一个入站作业并将其发送到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
})
}

1 个答案:

答案 0 :(得分:19)

通过阅读将Reader转换为字节。实际上并没有更有效的方法。

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

如果您无条件地将字节从io.Reader转移到io.Writer,则可以使用io.Copy