แปลงไบต์เป็น io.Reader


177

ในโครงการของฉันฉันมี byte slice จากคำตอบของคำขอ

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อย่างไร ในกรณีนั้นการตอบสนองร่างกายมีประเภทนั้นอยู่แล้ว
Arjan

3
golang.org/pkg/bytes/#NewReaderจะ "เปิด" ซึ่งเป็น[]byteสระio.Reader(และ io.ReadSeeker)
ANisus

@Arjan yap ~ เนื้อหา ... ฉันต้องการได้รับการตอบสนองเป็น io.reader .but ในคลาสฐานเมื่อฉันเสร็จสิ้นการร้องขอการตอบสนองถูกฆ่า .. เพียงบันทึกร่างกายการตอบสนองเป็น [] byte ใน struct
Chan Willson

@ANisus ฉันจะลอง .... ขอบคุณเพื่อน ... โดยวิธี ... มันดูเหมือนเป็นประเภทที่แตกต่างกัน ..
Chan Willson

@ChanWillson: ความต้องการนั้นสมเหตุสมผลมากขึ้นร่างกายไม่สามารถอ่านได้หลังจากปิดมันแล้ว ตามที่แนะนำให้ใช้*bytes.Readerซึ่งดำเนินการกับio.Readerส่วนต่อประสาน
Arjan

คำตอบ:


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)
ANISUS

ฉันไม่เข้าใจข้อผิดพลาดจากgovet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich

1
@VitalyZdanevich นั่นเป็นเพราะbytes.Readerมีตัวรับสัญญาณตัวชี้และคุณกำลังเปลี่ยนจากประเภทตัวชี้ ( *bytes.Reader) เป็นประเภทฐาน ( bytes.Reader) เพียงกำจัดเครื่องหมายดอกจัน ( *) และคุณควรจะสบายดี :)
23911

-18
r := strings(byteData)

นอกจากนี้ยังใช้งานได้กลาย[]byteเป็นio.Reader


4
สตริงเป็นแพคเกจดังนั้นฉันสมมติว่าสตริง (byteData) มีความหมาย คุณสามารถรับสายจากชิ้นไบต์ในลักษณะที่ (ลบ s) สตริงไม่ได้ใช้อินเทอร์เฟซ io.Reader เนื่องจากไม่มีวิธีการอ่าน () play.golang.org/p/eRMmtHsscdเป็นตัวอย่างที่ล้มเหลวเมื่อมีการเรียกใช้ Read () บนสตริง
jeffrey 20
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.