我是 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中文網其他相關文章!