Golang Channel is Collection Type part 3

ตอน 3 มาดูพฤติกรรมการรับและส่งข้อมูลไปในตัวแปรแบบ Channel ที่มีค่าเป็น nil และ Channel ที่โดน close ไปแล้วกันครับ

Channel zero value is nil

zero value คือค่าของตัวแปรเมื่อไม่ได้กำหนดค่าอะไรให้ครับ เช่น

var ch chan int

ตัวแปร ch จะมีค่าเป็น nil

การรับและส่งค่าไปที่ตัวแปร Channel ที่เป็น nil จะเกิดการ blocking เสมอ

Close Channel

เราสามารถใช้ function close ซึ่งเป็น builtin function เพื่อสั่ง close channel ได้ โดยที่ channel ที่จะเอามา close ต้องไม่มีค่าเป็น nil

การ close channel จะทำให้พฤติกรรมการ blocking เปลี่ยนไป คือ channel ที่ทำการ close แล้วนั้น จะไม่สามารถส่งค่าอะไรเข้าไปได้ ถ้าทำการส่ง จะเกิด panic ขึ้น ส่วนการนำค่าออกจาก channel ที่ close ไปแล้วนั้นจะได้ค่า zero value ของ type ที่เก็บใน channel เสมอ โดยไม่มีการ blocking เกิดขึ้น เช่น

ch := make(chan int)
close(ch)
fmt.Println(<-ch) // Output: 0
fmt.Println(<-ch) // Output: 0

ในกรณีที่มีค่าอยู่ใน channel อยู่ก่อนที่จะ close การเอาค่าออก ก็จะเอาค่าออกจากของที่มีอยู่ก่อนจนหมดแล้วเมื่อเอาออกอีกก็จะได้ zero value เช่น

ch := make(chan int)
ch <- 10
close(ch)
fmt.Println(<-ch) // Output: 10
fmt.Println(<-ch) // Output: 0

เราสามารถเช็คว่า channel นั้น close แล้วหรือยังได้โดยลองเอาค่าออกจาก channel นั้นแล้วกำหนดค่าให้ตัวแปร แต่ให้เอาตัวแปรสองตัวมารับ ซึ่งเมื่อทำแบบนี้ ค่าแรก เป็นค่าที่ได้ ส่วนค่าที่สอง เป็น bool ที่บอกว่า channel นั้น close แล้วหรือยัง เช่น

if val, ok := <- ch; !ok {
fmt.Println("Closed Channel"); // Output: Closed Channel
}

ตอน 3 จบเท่านี้ก่อน ตอน 4 มาดูว่าเราจะใช้ for loop ในการวนซ้ำเพื่อ เอาค่าออกมาจาก channel ได้ยังไงบ้าง