web-dev-qa-db-fra.com

Le moyen le plus efficace de convertir io.ReadCloser en tableau d'octets

J'ai un serveur Web Go très simple. Son travail consiste à recevoir une charge utile json entrante. Il publie ensuite la charge utile vers un ou plusieurs services qui attendent un tableau d'octets. La charge utile n'a pas besoin d'être vérifiée. Je viens de m'envoyer.

Dans ce cas, il reçoit un travail entrant et l'envoie à Google PubSub. Ce pourrait être un autre service - cela n'a pas vraiment d'importance. J'essaie de trouver le moyen le plus efficace de convertir l'objet en un tableau d'octets sans d'abord le décoder.

Pourquoi? Semble un peu inutile de décoder et de convertir en JSON sur un serveur, pour le démarsaler plus tard. De plus, je ne veux pas conserver deux structures identiques dans deux packages.

Comment est-il possible de convertir l'io.ReadCloser en un tableau d'octets donc je n'ai besoin de démarsaler qu'une seule fois. J'ai essayé quelque chose comme cette réponse, mais je ne pense pas que ce soit le moyen le plus efficace non plus:

De io.Reader à la chaîne dans Go

Mon code de serveur http ressemble à ceci:

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
})
}
14
Jenny Blunt

Vous convertissez un Reader en octets, en le lisant. Il n'y a pas vraiment de moyen plus efficace de le faire.

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

Si vous transférez sans condition des octets à partir d'un io.Reader à un io.Writer, vous pouvez simplement utiliser io.Copy

25
JimB