বাইট স্লাইস 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কীভাবে রূপান্তর করব? আমি নতুন পাঠক / লেখক চেষ্টা করেছি কিন্তু সফল হইনি।


3
আমি যদি সঠিকভাবে বুঝতে পারি তবে আপনি এর মতো প্রতিক্রিয়া চান io.Reader? সেক্ষেত্রে রেস.বাডি ইতিমধ্যে সেই ধরণের।
আরজান

3
golang.org/pkg/bytes/# নিউ রিডার[]byte একটি io.Reader(এবং io.ReadSeeker) এ "পরিণত" হবে
আনিসাস

@ আরজান ইয়াপ ~ বডি ... আমি আইওআরেডার হিসাবে প্রতিক্রিয়া পেতে চাই the তবে আমি অনুরোধটি শেষ করার পরে বেস ক্লাসে, প্রতিক্রিয়াটি মেরে ফেলা হয়েছে .. কেবল একটি প্রতিক্রিয়ার শরীরকে কাঠামোর বাইট হিসাবে সংরক্ষণ করুন।
চান উইলসন

@ ইউনিসাস আমি চেষ্টা করব .... থেক্সেক্স ডুড.. উপায় ... এটি দেখতে বিভিন্ন ধরণের মত ..
চ্যান উইলসন

@ চ্যানউইলসন: সেই প্রয়োজনীয়তা আরও অর্থবোধ করে, দেহটি বন্ধ করার পরে এটি পড়তে পারে না। প্রস্তাবিত ব্যবহার *bytes.Readerযা io.Readerইন্টারফেস প্রয়োগ করে ।
আরজান

উত্তর:


304

একটি টাইপ যে কার্যকরী পেতে io.ReaderA থেকে []byteফালি, আপনি ব্যবহার করতে পারেন bytes.NewReaderমধ্যে bytesপ্যাকেজ:

r := bytes.NewReader(byteData)

এটি (এবং ) ইন্টারফেস bytes.Readerপ্রয়োগ করে এমন ধরণের মান প্রদান করবে ।io.Readerio.ReadSeeker

তাদের একই "টাইপ" না হওয়ার বিষয়ে চিন্তা করবেন না। io.Readerএটি একটি ইন্টারফেস এবং বিভিন্ন ধরণের দ্বারা প্রয়োগ করা যেতে পারে। গো-তে ইন্টারফেসগুলি সম্পর্কে আরও কিছু জানতে, কার্যকর গো: ইন্টারফেস এবং প্রকারগুলি পড়ুন


এটিকে একটি []byteরূপান্তর করার জন্য কি একই রকম ফাংশন রয়েছে io.Writer? উদাহরণস্বরূপbytes.NewWriter(destination)
বাইসোর

4
@ বেক্সর হ্যাঁ, আপনি যা খুঁজছেন তা হ'ল 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
@ ভিটালিজেডেনেভিচ এটি হ'ল কারণ bytes.Readerপয়েন্টার রিসিভার রয়েছে এবং আপনি এটি একটি পয়েন্টার টাইপ ( *bytes.Reader) থেকে বেস টাইপ ( bytes.Reader) এ পরিণত করছেন। কেবল তারকাচিহ্ন থেকে মুক্তি পান ( *এবং) আপনার ভাল হওয়া উচিত :)
আনিসাস

-18
r := strings(byteData)

এটি []byteরূপান্তর করতেও কাজ করেio.Reader


4
স্ট্রিংস একটি প্যাকেজ, সুতরাং আমি ধরে নিচ্ছি স্ট্রিং (বাইটডাটা) বোঝানো হয়েছিল। আপনি বাইট স্লাইস থেকে স্ট্রিং পেতে পারেন সেই পদ্ধতিতে (বিয়োগ) the স্ট্রিং io.Reader ইন্টারফেস বাস্তবায়িত করে না কারণ এতে একটি পঠন () পদ্ধতি নেই। play.golang.org/p/eRMmtHsscd একটি উদাহরণ যা পঠন (স্ট্রিং) এ ডাকা হলে ব্যর্থ হয়।
জেফ্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.