Goroutine คืออะไร?
Goroutine คือกลไกที่ Go ใช้เพื่อจัดการงานหลายอย่างพร้อมกัน (Concurrency) ได้อย่างมีประสิทธิภาพ โดยใช้ memory น้อยและไม่ต้องจัดการ thread ด้วยตนเอง
เราสามารถเริ่ม goroutine ได้ง่าย ๆ ด้วยคำว่า go
หน้าชื่อฟังก์ชัน
go sayHello()
ตัวอย่าง: การใช้ Goroutine
package main import ( "fmt" "time" ) func sayHello() { for i := 0; i < 5; i++ { fmt.Println("Hello from Goroutine") time.Sleep(500 * time.Millisecond) } } func main() { go sayHello() // run as goroutine for i := 0; i < 5; i++ { fmt.Println("Main function running") time.Sleep(700 * time.Millisecond) } }
ผลลัพธ์: โค้ดนี้จะแสดงข้อความจากฟังก์ชันหลักและ goroutine สลับกันแสดง (ขึ้นกับ scheduler)
Channel คืออะไร?
Channel คือเครื่องมือที่ Go ใช้สำหรับการสื่อสารระหว่าง goroutine อย่างปลอดภัย โดยทำงานแบบ blocking โดย design
การสร้างและส่งค่าผ่าน channel
ch := make(chan string) // สร้าง channel สำหรับ string
go func() { ch <- "Hello from goroutine" // ส่งค่าเข้า channel }() msg := <-ch // รับค่าออกจาก channel fmt.Println(msg)
ผลลัพธ์: โปรแกรมจะรอรับค่าก่อนจะไปบรรทัดถัดไป
Buffered Channel
channel แบบ buffer ช่วยให้ส่งค่าได้โดยไม่ block ทันที:
ch := make(chan int, 2) // buffered channel ch <- 1 ch <- 2 // ch <- 3 // ถ้าเพิ่มอีกจะ block จนกว่าจะมีการรับ fmt.Println(<-ch) fmt.Println(<-ch)
ภาพประกอบการทำงาน

ปิด Channel อย่างไร?
สามารถใช้ close(channel)
เพื่อระบุว่า channel นี้จะไม่มีการส่งข้อมูลแล้ว เช่น:
close(ch)
การใช้กับ range
:
for msg := range ch { fmt.Println(msg) }
Select ใน Channel
ใช้เพื่อรอหลาย channel พร้อมกัน:
select { case msg1 := <-ch1: fmt.Println("Received", msg1) case msg2 := <-ch2: fmt.Println("Received", msg2) default: fmt.Println("ไม่มีอะไรมาเลย") }
Goroutine Leak คืออะไร?
หาก goroutine ถูกสร้างขึ้น แต่ไม่สามารถออกจาก function ได้ หรือรอบางสิ่งที่ไม่มีวันเกิดขึ้น จะเกิดปัญหา memory รั่วได้
แนวทางป้องกัน:
- ใช้ timeout หรือ context
- ควบคุมการปิด channel อย่างเป็นระบบ
สรุป
- Goroutine: เบา ใช้ง่าย สร้างได้มาก
- Channel: ใช้ส่งข้อมูลระหว่าง goroutine อย่างปลอดภัย
- ควรเรียนรู้: select, buffered channel, close, range
หากคุณเข้าใจแนวคิดพื้นฐานเหล่านี้แล้ว การเขียน concurrent system ด้วย Go จะง่ายกว่าที่เคย!
บทความนี้เผยแพร่โดย: poolsawat.com | เขียนโดย: King Pool