Maison >développement back-end >Golang >goroutine n'écrit pas sur la chaîne
Je suis nouveau et j'ai un problème avec le code ci-dessous
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) }
Aucune valeur n'est reçue dans la goroutine pdf
中从 generatefromhtml
接收信息,但是 buf
, donc la fonction dans laquelle se trouve ce code renvoie un octet de taille 0.
Toute aide est grandement appréciée. Merci d'avance
Ce code est de nature synchrone. Le gestionnaire génère une tranche d'octets et doit utiliser la méthode c.blob pour renvoyer cette tranche lorsque ces octets sont prêts.
Le code publié démarre le travail dans une goroutine, n'attend pas la fin du travail et renvoie une tranche d'octet nul.
Vous pouvez résoudre ce problème en supprimant la goroutine :
data, err := pdf.GenerateFromHTML(string(rawDecodedText)) if err == nil { // handle error here } return c.Blob(http.StatusOK, MIMEApplicationPdf, data)
Le seul problème avec ce code est le chargement de toutes les données en mémoire, mais cela est inévitable si pdf.generatefromhtml
返回 []byte
Si nécessaire, vous pouvez améliorer cela en mettant à jour pdf.generatefromhtml
以返回 io.reader
et en utilisant c.Stream .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!