Konvertieren Sie das Byte-Slice in io.Reader

177

In meinem Projekt habe ich einen Byte-Slice aus der Antwort einer Anfrage.

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
}

Dies funktioniert, aber io.Readerwie konvertiere ich, wenn ich den Text der Antwort erhalten möchte? Ich habe den Newreader / Writer ausprobiert, war aber nicht erfolgreich.

Chan Willson
quelle
3
Wenn ich richtig verstehe, möchten Sie die Antwort als io.Reader? In diesem Fall ist resp.Body bereits von diesem Typ.
Arjan
3
golang.org/pkg/bytes/#NewReader "dreht" ein []bytezu einem io.Reader(und io.ReadSeeker)
ANisus
@Arjan yap ~ body ... Ich möchte die Antwort als io.reader erhalten. In der Basisklasse wurde die Antwort jedoch beendet, wenn ich die Anforderung abgeschlossen habe. Speichern Sie einfach einen Antworttext als [] Byte in struct.
Chan Willson
@ANisus ich werde versuchen .... thx dude.. übrigens ... es sieht aus wie ein anderer Typ ..
Chan Willson
@ChanWillson: Diese Anforderung ist sinnvoller, der Körper kann nach dem Schließen nicht gelesen werden. Wie vorgeschlagen verwenden, *bytes.Readerdie die io.ReaderSchnittstelle implementiert .
Arjan

Antworten:

304

Um einen Typ zu erhalten, der io.Readeraus einem []byteSlice implementiert wird , können Sie bytes.NewReaderim bytesPaket Folgendes verwenden:

r := bytes.NewReader(byteData)

Dies gibt einen Wert vom Typ zurück, bytes.Readerder die io.Reader(und io.ReadSeeker) Schnittstelle implementiert.

Mach dir keine Sorgen, dass sie nicht der gleiche "Typ" sind. io.Readerist eine Schnittstelle und kann von vielen verschiedenen Typen implementiert werden. Weitere Informationen zu Schnittstellen in Go finden Sie unter Effective Go: Schnittstellen und Typen .

ANisus
quelle
Gibt es eine ähnliche Funktion, um aus a []byteeine zu machen io.Writer? ZBbytes.NewWriter(destination)
byxor
4
@byxor Ja, was Sie suchen ist bytes.Buffer. Dort erstellen Sie einen Puffer, der io.Writerwie folgt implementiert : w := bytes.NewBuffer(destination).
ANisus
Ich verstehe diesen Fehler nicht von govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich
1
@VitalyZdanevich Das liegt daran, dass Zeigerempfänger vorhanden bytes.Readersind und Sie sie von einem Zeigertyp ( *bytes.Reader) in einen Basistyp ( bytes.Reader) umwandeln . *
Werde
-18
r := strings(byteData)

Dies funktioniert auch , um wiederum []byteinio.Reader

cmslotes
quelle
4
Strings ist ein Paket, daher gehe ich davon aus, dass string (byteData) gemeint war. Auf diese Weise können Sie eine Zeichenfolge aus einem Byte-Slice abrufen (abzüglich des s). String implementiert die io.Reader-Schnittstelle nicht, da sie keine Read () -Methode hat. play.golang.org/p/eRMmtHsscd ist ein Beispiel, das fehlschlägt, wenn Read () für eine Zeichenfolge aufgerufen wird.
Jeffrey