首页 >后端开发 >Golang >goroutine 未写入通道

goroutine 未写入通道

王林
王林转载
2024-02-06 08:30:08803浏览

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删除