goroutine 未写入通道

2024年 2月 6日 33.3k 0

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 登录后复制

在 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 未写入通道的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论