首頁  >  文章  >  後端開發  >  goroutine 未寫入通道

goroutine 未寫入通道

王林
王林轉載
2024-02-06 08:30:08777瀏覽

goroutine 未写入通道

問題內容

我是 go 新手,我在使用下面的程式碼時遇到問題

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)
}

在goroutine pdf 中從generatefromhtml 接收訊息,但是buf 沒有收到任何值,因此程式碼所在的函數傳回一個大小為0 的位元組.

非常感謝任何幫助。提前致謝


正確答案


此程式碼本質上是同步的。處理程序產生一個位元組切片,並應使用 c.blob 傳回該切片這些位元組準備就緒時的方法。

發布的程式碼在 goroutine 中開始工作,不等待工作完成並傳回空位元組切片。

您可以透過刪除 goroutine 來解決這個問題:

data, err := pdf.GenerateFromHTML(string(rawDecodedText))
if err == nil {
    // handle error here
}
return c.Blob(http.StatusOK, MIMEApplicationPdf, data)

此程式碼的唯一問題是將所有資料載入到記憶體中,但如果 pdf.generatefromhtml 傳回 []byte,則這是不可避免的。 如果有必要,您可以透過更新 pdf.generatefromhtml 以返回 io.reader 並使用 c 來改進這一點.流.

以上是goroutine 未寫入通道的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除