Golang Channel is Collection Type part 4

ตอน 4 ดูวิธีใช้ for range เพื่อวนซ้ำดึงค่าออกจาก channel กัน

Channel for loop

for เป็น keyword สำหรับการวนซ้ำเดียวที่มีใน Go ซึ่งเราใช้มันทั้งวนซ้ำแบบ counting ปกติ ใช้แบบ เงื่อนไข ใช้แบบ range กับ slice, array และ map ซึ่งตามชื่อ blog post ใน series นี้ผมบอกแล้วว่า Channel มันคือ data type ที่มีลักษณะเป็น collection แบบนึง เช่นเดียวกับข้อมูล data type slice, array และ map ที่ใช้ for range ในการวนซ้ำได้ channel ก็ทำได้เช่นกัน ตัวอย่างเช่น

ch := make(chan int)
// split goroutine for send data
go func(ch chan int) {
ch <- 1
ch <- 2
ch <- 3
ch <- 4
close(ch)
}(ch)
// loop receive value in channel exit when channel closed
for val := range ch {
fmt.Println(val)
}

จะเห็นว่าผมแยกอีก gorutine เพื่อทำหน้าที่เอาข้อมูลใส่ channel เมื่อได้ตามจำนวนที่ต้องการแล้วก็ทำการ close channel นั้นซะ

วิธีการใช้ for เพื่อวนซ้ำเอาค่าออกจาก channel ก็คล้ายกับ slice, array และ map ต่างกันตรงที่ ตัวแปรที่เอามาเก็บค่า ใช้ตัวแปรเดียว และค่าที่ได้เป็นค่าของที่ดึงออกมาจริงๆ ไม่ใช่ index แบบ slice, array และ key แบบ map

loop จะหยุดรับค่าเมื่อ channel นั้นถูก close ไปแล้ว ถ้าไม่ถูก close ก็จะพยายามเอาค่าออกซึ่งจะเกิดการ blocking เช่นกันเหมือนกับการรับค่าด้วย <- ปกติ ถ้าเกิดไม่มีการส่งค่ามา หรือ ไม่มีค่าใน buffer

ตอนต่อไป ตอนที่ 5 เราไปดูกันว่า ถ้าเราจะจัดการกับ หลาย channel พร้อมกัน ไม่ว่าจะรับหรือส่ง ซึ่งเอาได้เห็นกันไปแล้วว่ามีโอกาสที่จะเกิดการ blocking แล้วเราอยากให้โปรแกรมเราเลือกทำอะไรก็ตามที่สามารถทำได้โดยไม่ blocking จะทำอย่างไรได้บ้าง