2016-09-30 6 views
5

मैं request.Body(type io.ReadCloser) का उपयोग करना चाहता हूं जिसमें एक छवि है।गोलांग एक ही पाठक से कई बार पढ़ता है

मैं न ioutil.ReadAll() उपयोग करने के लिए के रूप में मैं फाइल करने के लिए सीधे इस शरीर में लिखने के लिए और साथ ही यह डिकोड करने के लिए चाहते हैं चाहते हैं, तो मैं केवल सामग्री के संदर्भ में उपयोग करने के लिए आगे कार्यप्रणाली कॉल को पास करना चाहते हैं,

मैं

package main 

import (
    "io/ioutil" 
    "log" 
    "strings" 
) 


func main() { 
    r := strings.NewReader("some io.Reader stream to be read\n") 
    a := &r 
    b := &r 
    log.Println(ioutil.ReadAll(*a)) 
    log.Println(ioutil.ReadAll(*b)) 

} 

नीचे दिखाया गया है, उदाहरण के लिए पाठक के कई उदाहरण बनाने की कोशिश की लेकिन दूसरे में फोन यह हमेशा nil में यह परिणाम है।

कृपया मेरी मदद करें मैं एक ही पाठक के लिए एकाधिक अलग संदर्भ कैसे पारित कर सकता हूं?

+3

पूर्ववत करने योग्य जिस तरह से आप के लिए कहा

package main import ( "bytes" "io" "io/ioutil" "log" "strings" ) func main() { r := strings.NewReader("some io.Reader stream to be read\n") var buf bytes.Buffer tee := io.TeeReader(r, &buf) log.Println(ioutil.ReadAll(tee)) log.Println(ioutil.ReadAll(&buf)) } 

उदाहरण। आगे संदर्भ के लिए जो पढ़ते हैं उसे कैप्चर करने के लिए 'io.TeeReader' का उपयोग करें, उदा। एक बाइट्स में। बफर '। – Volker

उत्तर

3

जब आप ReadAll पर कॉल करते हैं तो यह बफर खाली करने जा रहा है, इसलिए दूसरा कॉल हमेशा कुछ भी नहीं लौटाएगा। आप क्या कर सकते हैं ReadAll के परिणाम को बचाएं और अपने कार्यों में पुन: उपयोग करें। उदाहरण के लिए:

bytes, _ := ioutil.ReadAll(r); 
log.Println(string(bytes)) 
1

तकनीकी रूप से, एक पाठक पर, आप कई बार नहीं पढ़ सकते हैं।

  • यहां तक ​​कि अगर आप अलग अलग संदर्भ बनाने लेकिन
  • जब आप एक बार पढ़ यह एक ही वस्तु सभी संदर्भ द्वारा संदर्भित किया जाएगा।
  • तो आप सामग्री को पढ़ सकते हैं और इसे एक चर में संग्रहीत कर सकते हैं।
  • फिर उस चर को जितनी बार चाहें उतनी बार उपयोग करें।

यह दो बार प्रिंट करेगा।

package main 

import (
    "io/ioutil" 
    "log" 
    "strings" 
) 

func main() { 
    r := strings.NewReader("some io.Reader stream to be read\n") 
    stringData, _ := ioutil.ReadAll(r) 
    log.Println(stringData) 
    log.Println(stringData) 
} 
+0

मैं कारण जानना चाहता हूं क्यों नहीं :-) –

+2

@ अभिषेकसोनी: एक 'io.Reader' एक स्ट्रीम है। एक बार स्ट्रीम खत्म करने के बाद, और नहीं है। यदि आप स्ट्रीम का हिस्सा पढ़ते हैं, तो अगला पढ़ना जारी रहता है जहां आपने छोड़ा था। – JimB

8

io.Reader को स्ट्रीम की तरह माना जाता है। इस वजह से आप इसे दो बार नहीं पढ़ सकते हैं। एक आने वाले टीसीपी कनेक्शन की कल्पना करो। आप क्या आ रिवाइंड नहीं कर सकते

लेकिन आप धारा नकल करने io.TeeReader उपयोग कर सकते हैं:। पर Go Playground

संबंधित मुद्दे