Stream data ด้วย pipe

มี function นึงเขียน data ใส่ io.Writer
กับอีก function นึงอ่าน data จาก io.Reader แล้วเขียนลง io.Writer อีกตัว

เราจะ stream data จาก function แรกไป function ที่สองได้ยังไง ?


ถ้าจะให้ยกตัวอย่างง่าย ๆ เช่น เราจะเอา data จาก template มา minify แล้วส่งต่อไปให้ http.ResponseWriter แบบนี้

https://gist.github.com/acoshift/2a92b9cc49f6dfd88ef3c44417af267a

จะเห็นว่าเราต้องสร้าง buffer เป็นตัวกลางให้ template เขียนใส่ buffer ก่อน แล้วค่อยให้ minify มาอ่านจาก buffer แล้วเขียนลง response writer

ถ้าเป็น html ไฟล์เล็ก ๆ ไม่กี่ KiB คงไม่มีปัญหาอะไร แต่ถ้า data มันใหญ่มาก ๆ ขนาดเป็น GB, buffer เรา จะต้องเก็บ data ทั้งหมดใน Ram

ซึ่งเราสามารถทำให้ template ส่ง data ให้ minify โดยตรงได้เลย โดยที่ไม่ต้องผ่าน buffer โดยใช้ io.Pipe

https://gist.github.com/acoshift/9eca8c592cb050112176eb4566238a15

จากการทดลอง ถ้า data มีขนาดเล็กมาก (เช่น html) ใช้ buffer เร็วกว่าใช้ pipe เพราะถ้าเราใช้ pipe เราจะต้องสร้าง go routine ขึ้นมาใหม่ ซึ่งช้ากว่าเขียนลง buffer

Like what you read? Give acoshift a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.