Maison > développement back-end > Golang > le corps du texte

goroutine n'écrit pas sur la chaîne

王林
Libérer: 2024-02-06 08:30:08
avant
776 Les gens l'ont consulté

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)
}
Copier après la connexion

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)
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal