Ich bin neu und habe ein Problem mit der Verwendung des folgenden Codes
func (h *Handler) GeneratePdfFromHTML(c echo.Context) (err error) { req := &createPdfFromHTMLRequest{} if err := req.bind(c); err != nil { return c.JSON(http.StatusBadRequest, utils.NewError(err)) } rawDecodedText, err := base64.StdEncoding.DecodeString(req.HTML) if err != nil { return c.JSON(http.StatusInternalServerError, utils.NewError(err)) } buf := make(chan []byte) go func() { defer close(buf) pdf, err := pdf.GenerateFromHTML(string(rawDecodedText)) if err == nil { buf <- pdf } }() if err != nil { return c.JSON(http.StatusInternalServerError, utils.NewError(err)) } return c.Blob(http.StatusOK, MIMEApplicationPdf, <-buf) }
In der Goroutine wird kein Wert empfangen pdf
中从 generatefromhtml
接收信息,但是 buf
, daher gibt die Funktion, in der sich dieser Code befindet, ein Byte der Größe 0 zurück.
Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus
Dieser Code ist synchroner Natur. Der Handler generiert einen Byte-Slice und sollte die Methode c.blob verwenden, um diesen Slice zurückzugeben, wenn diese Bytes bereit sind.
Der gepostete Code beginnt mit der Arbeit in einer Goroutine, wartet nicht, bis die Arbeit abgeschlossen ist und gibt ein Null-Byte-Slice zurück.
Sie können dieses Problem lösen, indem Sie die Goroutine entfernen:
data, err := pdf.GenerateFromHTML(string(rawDecodedText)) if err == nil { // handle error here } return c.Blob(http.StatusOK, MIMEApplicationPdf, data)
Das einzige Problem bei diesem Code besteht darin, alle Daten in den Speicher zu laden, aber das ist unvermeidbar, wenn pdf.generatefromhtml
返回 []byte
Bei Bedarf können Sie dies verbessern, indem Sie pdf.generatefromhtml
以返回 io.reader
aktualisieren und c.Stream .
Das obige ist der detaillierte Inhalt vonGoroutine schreibt nicht in den Kanal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!