我有一个非常简单的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
})
}
2条答案
按热度按时间5f0d552i1#
你可以通过阅读来将Reader转换为字节。没有比这更有效的方法了。
如果要无条件地将字节从
io.Reader
传输到io.Writer
,则可以只使用io.Copy
k5ifujac2#
如果人们没有看到@degath的评论,
ioutil已弃用:从Go 1.16开始,相同的功能现在由包io或包os提供,这些实现应该在新代码中优先使用。有关详细信息,请参阅特定的函数文档。