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

huwehgph  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(177)

我有一个非常简单的Go Web服务器。它的工作是接收入站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
})
}
5f0d552i

5f0d552i1#

你可以通过阅读来将Reader转换为字节。没有比这更有效的方法了。

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

如果要无条件地将字节从io.Reader传输到io.Writer,则可以只使用io.Copy

k5ifujac

k5ifujac2#

如果人们没有看到@degath的评论,
ioutil已弃用:从Go 1.16开始,相同的功能现在由包io或包os提供,这些实现应该在新代码中优先使用。有关详细信息,请参阅特定的函数文档。

body, readBodyErr := io.ReadAll(response.Body)

相关问题