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

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.