Chuyển đổi byte byte thành io.Reader


177

Trong dự án của tôi, tôi có một lát byte từ phản hồi của yêu cầu.

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
}

Điều này hoạt động, nhưng nếu tôi muốn nhận được phản hồi của cơ thể io.Reader, làm cách nào để chuyển đổi? Tôi đã thử trình đọc / viết mới nhưng không thành công.


3
Nếu tôi hiểu chính xác bạn muốn phản hồi như io.Readerthế nào? Trong trường hợp đó, resp.Body đã thuộc loại đó.
Arjan

3
golang.org/pkg/bytes/#NewReader sẽ "biến" a []bytethành một io.Reader(và io.ReadSeeker)
ANisus

@Arjan yap ~ body ... tôi muốn nhận được phản hồi là io.reader. Nhưng trong lớp cơ sở khi tôi hoàn thành yêu cầu, phản hồi đã bị giết .. chỉ cần lưu nội dung phản hồi dưới dạng [] byte trong struct.
Chan Willson

@ANisus tôi sẽ thử .... thx dude..bằng cách ... nó trông giống như kiểu khác ..
Chan Willson

@ChanWillson: Yêu cầu đó có ý nghĩa hơn, cơ thể không thể được đọc sau khi đóng nó. Theo đề xuất sử dụng *bytes.Readermà thực hiện io.Readergiao diện.
Arjan

Câu trả lời:


304

Để có được một loại thực hiện io.Readertừ một []bytelát, bạn có thể sử dụng bytes.NewReadertrong bytesgói:

r := bytes.NewReader(byteData)

Điều này sẽ trả về một giá trị của loại bytes.Readerthực hiện giao diện io.Reader(và io.ReadSeeker).

Đừng lo lắng về việc chúng không cùng "kiểu". io.Readerlà một giao diện và có thể được thực hiện bởi nhiều loại khác nhau. Để tìm hiểu thêm một chút về giao diện trong Go, hãy đọc Go hiệu quả: Giao diện và loại .


Có một chức năng tương tự để biến một []bytethành một io.Writer? Ví dụ:bytes.NewWriter(destination)
byxor

4
@byxor Vâng, những gì bạn đang tìm kiếm là bytes.Buffer. Ở đó bạn tạo một bộ đệm thực hiện io.Writernhư thế này : w := bytes.NewBuffer(destination).
ANisus

Tôi không hiểu lỗi này từ govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich

1
@VitalyZdanevich Đó là bởi vì bytes.Readercó bộ thu con trỏ và bạn đang chuyển nó từ loại con trỏ ( *bytes.Reader) sang loại cơ sở ( bytes.Reader). Chỉ cần thoát khỏi dấu hoa thị ( *) và bạn sẽ ổn thôi :)
ANisus

-18
r := strings(byteData)

Điều này cũng hoạt động để biến []bytethànhio.Reader


4
Chuỗi là một gói, vì vậy tôi giả sử chuỗi (byteData) có nghĩa là. Bạn có thể nhận được một chuỗi từ một lát byte theo cách đó (trừ s). Chuỗi không triển khai giao diện io.Reader vì nó không có phương thức Read (). play.golang.org/p/eRMmtHsscd là một ví dụ thất bại khi Read () được gọi trên một chuỗi.
jeffrey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.