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