2016-03-19 14 views
-2

Wenn ich einen Code wie das folgende Beispiel habe, der ein Bild von einem Link abruft und es dann auf dem Datenträger speichert, was ist der beste Weg, um die Bilddaten weiterzugeben?Was ist ein effizienter Weg, um einen Antworttext (response.Body) in Go zu übergeben?

Ich dachte über die Verwendung von ioutil.ReadAll(res.Body), um es in []byte zu konvertieren, aber die Übergabe scheint teuer, obwohl ich nicht aus der Dokumentation sagen kann, ob es eine Scheibe oder ein Array zurückgibt. Ich versuchte auch, einen Zeiger auf res.Body, einen *io.ReadCloser Art zurückzubringen, aber ich konnte nicht herausfinden, wie man die .Close() Methode auf der verwiesenen Schnittstelle richtig nennt.

Ich verstehe, dass das Verschieben des Sicherungscodes in die FetchImage Funktion wahrscheinlich der einfachste Weg wäre, dies zu lösen, aber ich möchte diese Teile, wenn möglich, getrennt haben.

Außerdem bin ich sehr neu zu gehen, also wenn es etwas in diesem Code, der schlecht aussieht, bitte lass es mich wissen.

Antwort

1

Verwenden Sie ioutil.ReadAll. Die Funktion gibt eine Scheibe von Bytes zurück.

Scheiben sind effizient zu umgehen. Ein Slice ist ein Zeiger auf das Backing-Array, eine Länge und eine Kapazität.

Sie können auch den Antworttext weitergeben, aber seien Sie vorsichtig. Der Antworttext muss geschlossen werden, um die zugrunde liegende Verbindung freizugeben. Der Code in der Frage schließt den Antworttextkörper, aber es ist schwierig zu sehen, da der Antworttextteil die Funktion weitergegeben hat, an der er geschlossen wurde.

+0

Danke für die Antwort. Ist es nicht ein wenig überflüssig, denn dann müssten Sie einen neuen Reader erstellen, der an io.Copy übergeben wird, wenn res.Body diese Schnittstelle bereits erfüllt? – Wilfred

+0

Call Write direkt anstelle von io.Copy: 'file.Write (Daten)' –

1

In Go haben alle Arrays einen Größenspezifizierer und sehen wie [8]byte aus. Scheiben haben dies nicht und sehen aus wie []byte. Slices intern speichern nur einen Zeiger auf die Daten, die Länge des Slices und die Kapazität des Slices. Dies sind nur 24 Bytes auf einem 64-Bit-System, so dass Sie sich nicht darum kümmern müssen, es herumzugeben.

Allerdings würde ich empfehlen, eine *ImageData von FetchImage zurückgeben, da es bereits Metadaten wie den Namen des Bildes hat.

Warum Sie einen Zeiger auf eine Schnittstelle nicht nehmen können, gibt es einen Post here on SO, der warum erklärt.

Auch in Save Sie defer file.Close() vor der Überprüfung auf einen Fehler. Sie sollten dies austauschen, da die Datei bei einem Fehler null ist und wahrscheinlich segfault wird.

+0

Vielen Dank für die Antwort - einige gute Infos. – Wilfred

Verwandte Themen