बाइट स्लाइस को io.Reader में बदलें


177

मेरे प्रोजेक्ट में, मेरे पास अनुरोध के जवाब से बाइट स्लाइस है।

defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode))
    return
}

respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
    return
}

यह काम करता है, लेकिन अगर मैं प्रतिक्रिया के लिए शरीर प्राप्त करना चाहता हूं io.Reader, तो मैं कैसे परिवर्तित करूं? मैंने newreader / लेखक की कोशिश की, लेकिन सफल नहीं था।


3
अगर मैं सही ढंग से समझूं तो आप प्रतिक्रिया चाहते हैं io.Reader? उस मामले में resp.Body पहले से ही उस प्रकार का है।
अर्जन

3
golang.org/pkg/bytes/#NewReader[]byte एक io.Reader(और io.ReadSeeker) में "बारी" करेगा
ANisus

@ अर्जन याप ~ शरीर ... मैं बेस क्लास में io.reader के रूप में प्रतिक्रिया प्राप्त करना चाहता हूं। लेकिन जब मैं अनुरोध समाप्त करता हूं, तो प्रतिक्रिया मारी गई है .. बस एक प्रतिक्रिया बॉडी को [] बाइट के रूप में सहेजें।
विल्सन

@Anisus मैं कोशिश करूँगा .... thx दोस्त..इस तरह ... यह अलग तरह का दिख रहा है ..
Chan Willson

@ChanWillson: यह आवश्यकता अधिक समझ में आती है, इसे बंद करने के बाद शरीर को नहीं पढ़ा जा सकता है। जैसा कि सुझाव दिया गया है कि *bytes.Readerकौन सा io.Readerइंटरफ़ेस लागू करता है।
अर्जन

जवाबों:


304

एक प्रकार है कि औजार प्राप्त करने के लिए io.Readerएक से []byteटुकड़ा, आप उपयोग कर सकते हैं bytes.NewReaderमें bytesपैकेज:

r := bytes.NewReader(byteData)

यह उस प्रकार का मान लौटाएगा bytes.Readerजो इंटरफ़ेस io.Reader(और io.ReadSeeker) को लागू करता है।

उनके बारे में चिंता न करें कि वे "समान" नहीं हैं। io.Readerएक इंटरफ़ेस है और इसे कई अलग-अलग प्रकारों द्वारा कार्यान्वित किया जा सकता है। गो में इंटरफेस के बारे में थोड़ा और जानने के लिए, प्रभावी गो पढ़ें : इंटरफेस और प्रकार


एक []byteमें एक बारी करने के लिए एक समान कार्य है io.Writer? उदाहरण के लिएbytes.NewWriter(destination)
byxor

4
@byxor हाँ, आप जो देख रहे हैं वह है bytes.Buffer। वहाँ आप एक बफर बनाते हैं io.Writerजो इस तरह से लागू होता है w := bytes.NewBuffer(destination):।
एनिसस

मुझे यह त्रुटि समझ में नहीं आती govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
विटाली ज़ेडेनविच

1
@VitalyZdanevich, क्योंकि bytes.Readerसूचक रिसीवर हैं, और आप इसे सूचक प्रकार ( *bytes.Reader) से आधार प्रकार ( bytes.Reader) में बदल रहे हैं । बस तारांकन से छुटकारा पाएं ( *) और आप ठीक होना चाहिए :)
ANisus

-18
r := strings(byteData)

यह भी बारी करने के लिए काम करता है []byteमेंio.Reader


4
स्ट्रिंग्स एक पैकेज है, इसलिए मैं मान रहा हूं कि स्ट्रिंग (बाइटडाटा) का मतलब था। आप उस तरीके से बाइट स्लाइस से एक स्ट्रिंग प्राप्त कर सकते हैं (शून्य से एस)। स्ट्रिंग io.Reader इंटरफ़ेस को लागू नहीं करता है क्योंकि इसमें रीड () विधि नहीं है। play.golang.org/p/eRMmtHsscd एक ऐसा उदाहरण है, जो पढ़े जाने पर असफल हो जाता है (जिसे स्ट्रिंग कहा जाता है)।
जेफरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.