Maison >développement back-end >Golang >goroutine n'écrit pas sur la chaîne

goroutine n'écrit pas sur la chaîne

王林
王林avant
2024-02-06 08:30:08804parcourir

goroutine 未写入通道

Contenu de la question

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


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer