[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-js2go-ep39-channels-and-pipelines-in-go-for-data-processing-all--*":3,"academy-blog-translations-s28wwjv2p4jxfgu":85},{"data":4,"page":84,"perPage":84,"totalItems":84,"totalPages":84},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":78,"keywords":79,"locale":54,"published_at":80,"scheduled_at":13,"school_blog":76,"short_description":81,"slug":82,"status":74,"title":6,"updated":83,"updated_by":13,"views":77},"JS2GO EP.39 การใช้ Channels และ Pipelines ใน Go สำหรับ Data Processing","sclblg987654321","school_blog_translations","\u003Cp>เมื่อคุณต้องจัดการข้อมูลจำนวนมาก เช่น\u003C\u002Fp>\u003Cul>\u003Cli>การอ่านไฟล์หลายชุดพร้อมกัน\u003C\u002Fli>\u003Cli>การประมวลผลข้อมูลจาก API หลายแหล่ง\u003C\u002Fli>\u003Cli>หรือการแปลงข้อมูลหลายขั้นตอน (Transform → Filter → Save)\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>สิ่งที่จำเป็นคือเทคนิค Parallel Processing เพื่อเพิ่ม Throughput ของระบบและใช้ทรัพยากรอย่างมีประสิทธิภาพ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ทั้ง JavaScript และ Go รองรับการประมวลผลแบบ Asynchronous แต่ใช้แนวทางที่ต่างกันอย่างชัดเจน:\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>ภาษา\u003C\u002Fth>\u003Cth>แนวทางหลัก\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>JavaScript\u003C\u002Ftd>\u003Ctd>ใช้ Promises \u002F async-await \u002F Event Loop\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Go (Golang)\u003C\u002Ftd>\u003Ctd>ใช้ Goroutines + Channels + Pipelines\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>1. แนวคิด Concurrency: JavaScript vs Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>คุณสมบัติ\u003C\u002Fth>\u003Cth>JavaScript\u003C\u002Fth>\u003Cth>Go\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>แนวคิดหลัก\u003C\u002Ftd>\u003Ctd>Async \u002F Event Loop\u003C\u002Ftd>\u003Ctd>Goroutines + Channels\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>แบบจำลองการทำงาน\u003C\u002Ftd>\u003Ctd>Single-threaded\u003C\u002Ftd>\u003Ctd>Multi-threaded (lightweight)\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>การสื่อสารระหว่าง process\u003C\u002Ftd>\u003Ctd>Callback \u002F Event\u003C\u002Ftd>\u003Ctd>Channel\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>จุดแข็ง\u003C\u002Ftd>\u003Ctd>ใช้งานง่าย เหมาะกับ I\u002FO-bound tasks\u003C\u002Ftd>\u003Ctd>ประสิทธิภาพสูง เหมาะกับ CPU-bound tasks\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>2. ตัวอย่างพื้นฐาน: Concurrency ใน JavaScript\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน JavaScript การทำงานพร้อมกัน (concurrent execution) สามารถทำได้ด้วย async\u002Fawait หรือ Promise.all()\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-javascript\">async function processData() {\n  const data = [1, 2, 3, 4, 5];\n\n  const results = await Promise.all(\n    data.map(async (n) =&gt; {\n      await new Promise((r) =&gt; setTimeout(r, 500)); \u002F\u002F จำลองการประมวลผล\n      return n * 2;\n    })\n  );\n\n  console.log(\"✅ Processed Data:\", results);\n}\n\nprocessData();\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์:\u003Cbr>✅ Processed Data: [2, 4, 6, 8, 10]\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>อธิบาย:\u003Cbr>JavaScript จะสร้าง Promise สำหรับแต่ละ task แล้วรันพร้อมกันใน background ผ่าน Event Loop\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>3. ตัวอย่างพื้นฐาน: Concurrency ใน Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน Go สามารถรันฟังก์ชันพร้อมกันได้ง่ายมากด้วย Goroutines\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc process(n int, ch chan int) {\n\ttime.Sleep(500 * time.Millisecond) \u002F\u002F จำลองการประมวลผล\n\tch &lt;- n * 2\n}\n\nfunc main() {\n\tdata := []int{1, 2, 3, 4, 5}\n\tch := make(chan int)\n\n\tfor _, n := range data {\n\t\tgo process(n, ch)\n\t}\n\n\tfor i := 0; i &lt; len(data); i++ {\n\t\tfmt.Println(\"✅ Result:\", &lt;-ch)\n\t}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์:\u003C\u002Fp>\u003Cp>✅ Result: 2\u003Cbr>✅ Result: 4\u003Cbr>✅ Result: 6\u003Cbr>✅ Result: 8\u003Cbr>✅ Result: 10\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>อธิบาย:\u003C\u002Fp>\u003Cul>\u003Cli>คำสั่ง \u003Ccode inline=\"\">go process(n, ch)\u003C\u002Fcode> สร้าง goroutine ซึ่งทำงานคู่ขนานกับฟังก์ชันหลัก\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">channel\u003C\u002Fcode> ใช้เป็น “ท่อส่งข้อมูล” ระหว่าง goroutines เพื่อส่งค่ากลับมาอย่างปลอดภัย\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>4. การใช้ Channel\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>Channel คือ “ท่อส่งข้อมูล” ระหว่าง goroutines ซึ่งช่วยให้สื่อสารกันได้โดยไม่ต้องใช้ lock\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">messages := make(chan string)\n\ngo func() {\n\tmessages &lt;- \"Hello from goroutine\"\n}()\n\nmsg := &lt;-messages\nfmt.Println(msg)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์:\u003Cbr>Hello from goroutine\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>สรุป:\u003Cbr>✅ Channel ช่วยให้ goroutines ติดต่อกันได้โดยไม่ต้องใช้ mutex หรือ lock\u003Cbr>✅ เป็นหัวใจสำคัญของระบบ Concurrent Programming ใน Go\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>5. การออกแบบ Pipeline Pattern ใน Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>Pipeline คือการเชื่อมต่อ goroutines หลายตัวเข้าด้วยกันผ่าน channels แต่ละขั้นตอน (stage) จะรับข้อมูลจาก channel หนึ่ง แล้วส่งผลลัพธ์ต่อไปยังอีก channel อย่างต่อเนื่อง\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>🔹 ตัวอย่าง: Simple Pipeline\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport \"fmt\"\n\n\u002F\u002F ขั้นตอนที่ 1: สร้างข้อมูล\nfunc generate(nums ...int) &lt;-chan int {\n\tout := make(chan int)\n\tgo func() {\n\t\tfor _, n := range nums {\n\t\t\tout &lt;- n\n\t\t}\n\t\tclose(out)\n\t}()\n\treturn out\n}\n\n\u002F\u002F ขั้นตอนที่ 2: ประมวลผล (คูณ 2)\nfunc multiply(in &lt;-chan int) &lt;-chan int {\n\tout := make(chan int)\n\tgo func() {\n\t\tfor n := range in {\n\t\t\tout &lt;- n * 2\n\t\t}\n\t\tclose(out)\n\t}()\n\treturn out\n}\n\n\u002F\u002F ขั้นตอนที่ 3: แสดงผลลัพธ์\nfunc main() {\n\tnums := generate(1, 2, 3, 4, 5)\n\tresults := multiply(nums)\n\n\tfor v := range results {\n\t\tfmt.Println(\"✅ Result:\", v)\n\t}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์:\u003Cbr>✅ Result: 2\u003Cbr>✅ Result: 4\u003Cbr>✅ Result: 6\u003Cbr>✅ Result: 8\u003Cbr>✅ Result: 10\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>อธิบาย:\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ccode inline=\"\">generate()\u003C\u002Fcode> สร้างข้อมูลและส่งผ่าน channel\u003C\u002Fli>\u003Cli>\u003Ccode inline=\"\">multiply()\u003C\u002Fcode> ประมวลผลแบบ concurrent\u003C\u002Fli>\u003Cli>Channel จะเชื่อมแต่ละขั้นตอนเข้าด้วยกัน ทำให้ทุกส่วนสามารถทำงานพร้อมกันได้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>6. การทำ Pipeline หลายขั้นตอน\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>คุณสามารถขยาย pipeline ให้ซับซ้อนขึ้นได้ เช่น\u003Cbr>\u003Ccode inline=\"\">generate → square → filter → aggregate → output\u003C\u002Fcode>\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ตัวอย่าง: Pipeline 3 ขั้นตอน\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport \"fmt\"\n\nfunc generate(nums ...int) &lt;-chan int {\n\tout := make(chan int)\n\tgo func() {\n\t\tfor _, n := range nums {\n\t\t\tout &lt;- n\n\t\t}\n\t\tclose(out)\n\t}()\n\treturn out\n}\n\nfunc square(in &lt;-chan int) &lt;-chan int {\n\tout := make(chan int)\n\tgo func() {\n\t\tfor n := range in {\n\t\t\tout &lt;- n * n\n\t\t}\n\t\tclose(out)\n\t}()\n\treturn out\n}\n\nfunc filterEven(in &lt;-chan int) &lt;-chan int {\n\tout := make(chan int)\n\tgo func() {\n\t\tfor n := range in {\n\t\t\tif n%2 == 0 {\n\t\t\t\tout &lt;- n\n\t\t\t}\n\t\t}\n\t\tclose(out)\n\t}()\n\treturn out\n}\n\nfunc main() {\n\tnums := generate(1, 2, 3, 4, 5)\n\tsquared := square(nums)\n\tfiltered := filterEven(squared)\n\n\tfor v := range filtered {\n\t\tfmt.Println(\"✅ Filtered Result:\", v)\n\t}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ผลลัพธ์:\u003Cbr>✅ Filtered Result: 4\u003Cbr>✅ Filtered Result: 16\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>7. การเปรียบเทียบกับ JavaScript\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>JavaScript ก็สามารถสร้าง pipeline ได้เช่นกัน ด้วย Array methods, async generators, หรือ RxJS\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-javascript\">async function* generate(nums) {\n  for (const n of nums) yield n;\n}\n\nasync function* square(input) {\n  for await (const n of input) yield n * n;\n}\n\nasync function* filterEven(input) {\n  for await (const n of input) if (n % 2 === 0) yield n;\n}\n\nfor await (const val of filterEven(square(generate([1,2,3,4,5])))) {\n  console.log(\"✅ Filtered Result:\", val);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อดีของ Go:\u003Cbr>✅ Concurrency ผ่าน channel มีประสิทธิภาพสูงกว่า\u003Cbr>✅ ควบคุม flow และ memory ได้ละเอียด\u003Cbr>✅ ไม่มี overhead ของ event loop\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ข้อดีของ JavaScript:\u003Cbr>✅ เขียนง่าย เข้าใจง่าย\u003Cbr>✅ เหมาะกับงาน I\u002FO-bound เช่น API requests หรือ streaming\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>8. แนวทางปฏิบัติที่ดี (Best Practices)\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>💡 ใช้ Buffered Channel เช่น \u003Ccode inline=\"\">make(chan int, 10)\u003C\u002Fcode> เพื่อลดการ block\u003Cbr>💡 ปิด channel ทุกครั้งเมื่อ goroutine เสร็จงาน (\u003Ccode inline=\"\">close(out)\u003C\u002Fcode>)\u003Cbr>💡 ใช้ \u003Ccode inline=\"\">select\u003C\u002Fcode> เพื่อ handle timeout หรือ cancellation\u003Cbr>💡 สำหรับ pipeline ที่ซับซ้อน ควรแยกแต่ละ stage ออกเป็น function ที่ชัดเจน\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>สรุป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>ประเด็น\u003C\u002Fth>\u003Cth>JavaScript\u003C\u002Fth>\u003Cth>Go\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Async Model\u003C\u002Ftd>\u003Ctd>Event Loop + Promise\u003C\u002Ftd>\u003Ctd>Goroutines + Channels\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Parallel Execution\u003C\u002Ftd>\u003Ctd>จำลองผ่าน async\u003C\u002Ftd>\u003Ctd>Real concurrent threads\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Pipeline Design\u003C\u002Ftd>\u003Ctd>Functional \u002F Stream\u003C\u002Ftd>\u003Ctd>Channel-based Pipeline\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Performance\u003C\u002Ftd>\u003Ctd>ดีมากสำหรับ I\u002FO-bound\u003C\u002Ftd>\u003Ctd>สูงมากสำหรับ CPU-bound\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>ความซับซ้อนของโค้ด\u003C\u002Ftd>\u003Ctd>เขียนง่ายกว่า\u003C\u002Ftd>\u003Ctd>ต้องเข้าใจ goroutine และ channel\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>คำแนะนำ:\u003C\u002Fp>\u003Cul>\u003Cli>ถ้าเน้น I\u002FO-heavy system (API, streaming, frontend) → ใช้ JavaScript\u003C\u002Fli>\u003Cli>ถ้าเน้น High-performance concurrent processing → ใช้ Go\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตอนต่อไป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน EP.40 ของซีรีส์ JS2GO\u003Cbr>เราจะพาคุณไปเรียนรู้ การ Optimize Performance ของโค้ด: Go vs JavaScript\u003Cbr>เปรียบเทียบเทคนิคการเพิ่มความเร็ว เช่น Garbage Collection, Memory Profiling, Parallel Execution, และ Benchmark Tools\u003Cbr>เพื่อค้นหาว่า “ภาษาไหนเร็วกว่าในโลกจริง” 🧠💨\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F#\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>","77_11zon_tqln3so5ar.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F1rm9mb65vfkuus7\u002F77_11zon_tqln3so5ar.webp","2026-03-04 08:45:29.773Z","",{"keywords":15,"locale":48,"school_blog":58},[16,23,28,33,38,43],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:45:27.349Z","n1nlaxsxjy2673f","Data Processing","2026-04-10 16:12:58.694Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:24:48.143Z","dourw0uuydrrh1h","Concurrency","2026-04-10 16:07:30.157Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:45:26.685Z","cipipihaumk5zpt","Pipelines","2026-04-10 16:12:58.461Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:20:42.484Z","vslzz9nvv6n77cx","JavaScript","2026-04-10 16:07:28.339Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:33:55.714Z","yxs12a8pjduka2m","Channels","2026-04-10 16:08:03.494Z",{"code":49,"collectionId":50,"collectionName":51,"created":52,"flag":53,"id":54,"is_default":55,"label":56,"updated":57},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":59,"collectionId":60,"collectionName":61,"expand":62,"id":76,"views":77},"hsa1afr8fcnd6qb","pbc_2105096300","school_blogs",{"category":63},{"blogIds":64,"collectionId":65,"collectionName":66,"created":67,"created_by":13,"id":59,"image":68,"image_alt":13,"image_path":69,"label":70,"name":71,"priority":72,"publish_at":73,"scheduled_at":13,"status":74,"updated":75,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:24:37.986Z","js2_go_2_11zon_y6paxmuz32.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fhsa1afr8fcnd6qb\u002Fjs2_go_2_11zon_y6paxmuz32.webp",{"en":71,"th":71},"JS2GO",10,"2025-08-11 03:41:08.820Z","published","2026-04-25 02:32:14.339Z","s28wwjv2p4jxfgu",221,"1rm9mb65vfkuus7",[20,25,30,35,40,45],"2025-11-12 02:36:58.760Z","เรียนรู้การใช้ Channels และ Pipelines ใน Go เพื่อสร้างระบบประมวลผลข้อมูลแบบ Parallel และ Asynchronous อย่างมีประสิทธิภาพ พร้อมตัวอย่างโค้ดจริง การเปรียบเทียบกับ JavaScript และแนวทางการออกแบบ Pipeline สำหรับงาน Data Processing ในระดับ Production","js2go-ep39-channels-and-pipelines-in-go-for-data-processing","2026-04-25 02:47:53.835Z",1,{"th":82}]