问题内容
我是 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)其它相关文章!