2015-04-20 31 views
48

W moim projekcie mam tablicę bajtów z odpowiedzi żądania.Konwertuj tablicę bajtów na io.read w 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 
    } 

To działa, ale jeśli chcę uzyskać odpowiedź organizmu za io.read, w jaki sposób mogę przekonwertować? Próbowałem czytnika/programisty, ale nie udało mi się.

+3

Jeśli dobrze rozumiem, chcesz odpowiedzi jako 'io.Reader'? W takim przypadku resp.Body jest już tego typu. – Arjan

+3

http://golang.org/pkg/bytes/#NewReader "zamieni" bajt '[] na' io.Reader' (i io.ReadSeeker) – ANisus

+0

@Arjan yap ~ body ... chcę dostać odpowiedź jako io.reader .but w klasie bazowej po zakończeniu żądania, odpowiedź została zabita. Zapisz tylko ciało odpowiedzi jako [] bajt w struct. –

Odpowiedz

100

Aby uzyskać typ, który implementuje io.Reader z []byte plaster można użyć bytes.NewReader w pakiecie bytes:

r := bytes.NewReader(byteData) 

ta zwróci wartość typu bytes.Reader który implementuje io.Reader (i io.ReadSeeker) interfejs.

Nie martw się, że nie są one tym samym "typem". io.Reader jest interfejsem i może być implementowany przez wiele różnych typów. Aby dowiedzieć się więcej na temat interfejsów w Go, przeczytaj Effective Go: Interfaces and Types.

-3

R: = struny (byteData)

Działa to również włączyć [] bajt do io.reader

+0

Ciągi to pakiet, więc zakładam, że ciąg znaków (byteData) miał na myśli. W ten sposób możesz otrzymać łańcuch z bajtów (minus s). Łańcuch nie implementuje interfejsu io.Reader, ponieważ nie ma metody Read(). https://play.golang.org/p/eRMmtHsscd to przykład, który kończy się niepowodzeniem, gdy funkcja Read() zostanie wywołana w ciągu znaków. – jeffrey

Powiązane problemy