Rumah > pembangunan bahagian belakang > Golang > goroutine tidak menulis ke saluran

goroutine tidak menulis ke saluran

王林
Lepaskan: 2024-02-06 08:30:08
ke hadapan
842 orang telah melayarinya

goroutine 未写入通道

Kandungan soalan

Saya baru pergi dan saya menghadapi masalah menggunakan kod di bawah

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)
}
Salin selepas log masuk

Tiada nilai diterima dalam goroutine pdf 中从 generatefromhtml 接收信息,但是 buf, jadi fungsi kod ini mengembalikan bait bersaiz 0.

Sebarang bantuan amat kami hargai. Terima kasih terlebih dahulu


Jawapan betul


Kod ini bersifat segerak. Pengendali menjana sekeping bait dan harus menggunakan kaedah c.blob untuk mengembalikan kepingan itu apabila bait ini sedia.

Kod yang disiarkan mula berfungsi dalam goroutine, tidak menunggu kerja selesai dan mengembalikan kepingan bait nol.

Anda boleh menyelesaikan masalah ini dengan membuang goroutine:

data, err := pdf.GenerateFromHTML(string(rawDecodedText))
if err == nil {
    // handle error here
}
return c.Blob(http.StatusOK, MIMEApplicationPdf, data)
Salin selepas log masuk

Satu-satunya masalah dengan kod ini ialah memuatkan semua data ke dalam memori, tetapi ini tidak dapat dielakkan jika pdf.generatefromhtml 返回 []byte Jika perlu, anda boleh menambah baik ini dengan mengemas kini pdf.generatefromhtml 以返回 io.reader dan menggunakan c.Stream .

Atas ialah kandungan terperinci goroutine tidak menulis ke saluran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan