
我是 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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号