2015-04-20 22 views
48

Trong dự án của tôi, tôi có một mảng byte từ câu trả lời của yêu cầu.Chuyển mảng byte thành io.read trong golang

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 
    } 

Công trình này, nhưng nếu tôi muốn lấy nội dung phản hồi cho io.read, làm cách nào để chuyển đổi? Tôi đã thử người mới/người viết nhưng không thành công.

+3

Nếu tôi hiểu đúng bạn muốn câu trả lời là 'io.Reader'? Trong trường hợp đó resp.Body đã thuộc loại đó. – Arjan

+3

http://golang.org/pkg/bytes/#NewReader sẽ "chuyển" một '[] byte' thành' io.Reader' (và io.ReadSeeker) – ANisus

+0

@Arjan yap ~ body ... tôi muốn lấy các phản ứng như io.reader. nhưng trong lớp cơ sở khi tôi hoàn thành yêu cầu, phản ứng đã bị giết .. chỉ cần lưu một cơ thể phản ứng như [] byte trong struct. –

Trả lời

100

Để có được một loại mà thực hiện io.Reader từ một lát []byte, bạn có thể sử dụng bytes.NewReader trong gói bytes:

r := bytes.NewReader(byteData) 

này sẽ trả về một giá trị kiểu bytes.Reader mà thực hiện giao diện io.Reader (và io.ReadSeeker).

Đừng lo lắng về việc chúng không phải là "cùng loại". io.Reader là 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ề các giao diện trong Go, hãy đọc Effective Go: Interfaces and Types.

-3

r: = chuỗi (byteData)

này cũng làm việc để biến [] byte vào io.reader

+0

Strings 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ừ các s). Chuỗi không thực hiện giao diện io.Reader vì nó không có phương thức Read(). https://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

Các vấn đề liên quan