12/04/2026 18:15น.

EP.8 Go กับ Goroutines - ทำหลายงานพร้อมกันแบบมือโปร!
#การพัฒนาแอปพลิเคชัน
#sync
#Channels
#Concurrency
#Goroutines
#Go
Go กับ Goroutines - ทำหลายงานพร้อมกันแบบมือโปร!
อยากให้โปรแกรมทำงานหลายอย่างพร้อมกันได้อย่างรวดเร็วไหม? วันนี้เราจะมาสอนการใช้ Goroutines และ Channels ใน Go ที่จะทำให้โปรแกรมของคุณประมวลผลได้ลื่นไหลและไม่ติดขัด
Goroutines คืออะไร?
Goroutine คือหน่วยประมวลผลขนาดเล็กที่ Go ใช้สำหรับการทำงานพร้อมกัน (concurrent). เมื่อเราสร้าง Goroutine, Go จะทำงานในเบื้องหลังโดยไม่บล็อกโปรแกรมหลัก ทำให้เราสามารถรันงานหลายงานไปพร้อมกันได้
ตัวอย่าง Goroutine:
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
time.Sleep(500 * time.Millisecond)
}
}
func main() {
go printNumbers() // สร้าง Goroutine
fmt.Println("Goroutine started")
time.Sleep(3 * time.Second) // รอให้ Goroutine ทำงานเสร็จ
}
Channels: การสื่อสารระหว่าง Goroutines
Channels ใช้สำหรับส่งข้อมูลระหว่าง Goroutines ทำให้การทำงานพร้อมกันปลอดภัยและเป็นระเบียบมากขึ้น
ตัวอย่าง Channel:
func main() {
messages := make(chan string)
go func() {
messages <- "Hello from Goroutine" // ส่งข้อมูลผ่าน Channel
}()
msg := <-messages // รับข้อมูลจาก Channel
fmt.Println(msg)
}
Buffered Channels:
Channels สามารถบัฟเฟอร์เพื่อเก็บข้อมูลได้หลายค่า:
func main() {
messages := make(chan string, 2) // บัฟเฟอร์ได้ 2 ค่า
messages <- "First"
messages <- "Second"
fmt.Println(<-messages)
fmt.Println(<-messages)
}
การควบคุม Concurrency ด้วย sync
Go มีแพ็กเกจ sync สำหรับควบคุม Concurrency เช่นการรอให้ Goroutines ทำงานเสร็จ:
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup, id int) {
fmt.Printf("Worker %d starting\n", id)
wg.Done() // ลดตัวนับลง 1
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(&wg, i)
}
wg.Wait() // รอให้ทุก Goroutine ทำงานเสร็จ
fmt.Println("All workers done")
}