Heim >Backend-Entwicklung >Golang >Goroutine schreibt nicht in den Kanal

Goroutine schreibt nicht in den Kanal

王林
王林nach vorne
2024-02-06 08:30:08829Durchsuche

goroutine 未写入通道

Frageninhalt

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


Richtige Antwort


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 .

verwenden

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen