Converti una porzione di byte in io.Reader


178

Nel mio progetto, ho una porzione di byte dalla risposta di una richiesta.

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
}

Funziona, ma se voglio ottenere il corpo della risposta io.Reader, come faccio a convertire? Ho provato il nuovo lettore / scrittore ma non ci sono riuscito.


3
Se ho capito bene vuoi la risposta come io.Reader? In tal caso resp.Body è già di quel tipo.
Arjan,

3
golang.org/pkg/bytes/#NewReader "trasformerà" a []bytein un io.Reader(e io.ReadSeeker)
ANisus

@Arjan yap ~ body ... voglio ottenere la risposta come io.reader. Ma nella classe base quando finisco la richiesta, la risposta è stata uccisa .. basta salvare un corpo di risposta come [] byte in struct.
Chan Willson,

@ANisus ci proverò ... grazie amico ... comunque ... sembra un tipo diverso ..
Chan Willson,

@ChanWillson: questo requisito ha più senso, il corpo non può essere letto dopo averlo chiuso. Come suggerito l'uso *bytes.Readerche implementa l' io.Readerinterfaccia.
Arjan,

Risposte:


307

Per ottenere un tipo implementato io.Readerda una []bytesezione, è possibile utilizzare bytes.NewReadernel bytespacchetto:

r := bytes.NewReader(byteData)

Ciò restituirà un valore di tipo bytes.Readerche implementa l' interfaccia io.Reader(e io.ReadSeeker).

Non preoccuparti che non siano dello stesso "tipo". io.Readerè un'interfaccia e può essere implementata da molti tipi diversi. Per ulteriori informazioni sulle interfacce in Go, leggi Go efficace: Interfacce e tipi .


Esiste una funzione simile per trasformare a []bytein io.Writer? Ad esempiobytes.NewWriter(destination)
byxor,

4
@byxor Sì, quello che stai cercando è bytes.Buffer. Ci si crea un buffer che implementa io.Writerin questo modo: w := bytes.NewBuffer(destination).
ANiso

Non capisco questo errore da govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich

1
@VitalyZdanevich Questo è perché bytes.Reader ha dei ricevitori di puntatori e lo stai trasformando da un tipo di puntatore ( *bytes.Reader) a un tipo di base ( bytes.Reader). Sbarazzati dell'asterisco ( *) e dovresti stare bene :)
ANisus il

-19
r := strings(byteData)

Questo funziona anche per trasformarsi []byteinio.Reader


4
String è un pacchetto, quindi presumo che intendesse stringa (byteData). È possibile ottenere una stringa da una porzione di byte in quel modo (meno la s). String non implementa l'interfaccia io.Reader in quanto non ha un metodo Read (). play.golang.org/p/eRMmtHsscd è un esempio non riuscito quando Read () viene chiamato su una stringa.
Jeffrey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.