2016-10-09 12 views
5

में कनवर्ट करने का सबसे प्रभावी तरीका मेरे पास एक बहुत ही सरल गो वेबसर्वर है। यह नौकरी एक इनबाउंड जेसन पेलोड प्राप्त करना है। इसके बाद यह एक या अधिक सेवाओं में पेलोड प्रकाशित करता है जो बाइट सरणी की अपेक्षा करता है। पेलोड की जांच करने की आवश्यकता नहीं है। बस भेजा गया।io.ReadCloser को बाइट सरणी

इस मामले में, यह एक इनबाउंड नौकरी प्राप्त करता है और इसे Google PubSub पर भेजता है। यह एक और सेवा हो सकती है - यह वास्तव में कोई फर्क नहीं पड़ता। मैं ऑब्जेक्ट को पहले डीकोड किए बिना ऑब्जेक्ट को बाइट सरणी में बदलने का सबसे प्रभावी तरीका खोजने का प्रयास कर रहा हूं।

क्यों? एक सर्वर पर जेएसओएन को डीकोड और कनवर्ट करने के लिए थोड़ा अपर्याप्त लगता है, केवल बाद में इसे अनमशाल करने के लिए। इसके अलावा, मैं दो पैकेजों में दो समान structs बनाए रखना नहीं चाहता।

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.Writer के लिए एक io.Reader से बाइट्स स्थानांतरित कर रहे हैं, तो आप बस का उपयोग कर सकते io.Copy

+0

बढ़िया, मैं करने की कोशिश की थी कि लेकिन यह अशक्त outputting था ... मैंने महसूस नहीं किया था कि कोशिश कर रहा एक डिकोड के बाद ऐसा करने के लिए ऐसा करना होगा। दो सबक सीखे, बड़े कान चीयर्स। –

+0

यह ध्यान रखना एक अच्छा विचार है कि 'io.Copy' आवंटन करता है। आप शायद गर्म पथ में 'io.CopyBuffer' का उपयोग करना चाहेंगे। –

+1

@ अमार बंडुकवाला, जब तक कि आपके पास पहले से ही बफर नहीं है, वे समान हैं, कॉपी केवल कॉफ़ी बफर कहते हैं। आपको किसी बिंदु पर आवंटन करने की आवश्यकता है, और एक std lib http अनुरोध की योजना में, यह ऐसे कई आवंटनों में से एक है और यह महत्वहीन होने की संभावना है। – JimB