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

Goroutine schreibt nicht in den Kanal

王林
Freigeben: 2024-02-06 08:30:08
nach vorne
811 Leute haben es durchsucht

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)
}
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage