[Golang] Let’s talk about channel.

Visarut Junsone
Lazy-Dev
Published in
2 min readMay 8, 2019

สวัสดีครับท่านผู้อ่าน วันนี้เราจะพูดกันถึงเรื่องของ channel ของ Golang กัน ก็ต้องเริ่มอธิบายกันก่อนเลยว่ามันคืออะไร

What is channel?

Channel ใน golang คือ วัตถุที่ใช้ในการสื่อสาร หรือพูดให้เข้าใจง่ายๆ เลยก็คือเปรียบเสมือนท่อที่ใช้ส่งผ่านข้อมูลหรืออ่านข้อมูลได้ ซึ่งโดยทั่วไปแล้วจะใช้ร่วมกับ goroutine เพื่อส่งผ่านข้อมูลหากัน

Channel explaination

รูปที่ 1 แสดงภาพตัวอย่างการใช้ Channel

เพื่อความเข้าใจที่ชัดขึ้นเรามาดูรูปที่ 1 กัน จะเห็นว่า ท่อ (มองให้มันเป็นท่อนะ) ตรงกลางนั้นคือ Channel ที่ใช้สำหรับส่งผ่านข้อมูล ทางซ้ายคือตัวแปรที่รอรับค่า ทางขวาคือ go routine ที่จะกระทำสิ่งต่างๆละเมื่อมีค่าที่ต้องการจะส่งมาให้ตัวแปร

รูปที่ 2 แสดงภาพตัวอย่างการส่งผ่านค่า

จากรูปที่ 2 เมื่อ Channel ที่ชื่อ message ได้ทำการรับค่าใน go routine ก็จะถูกส่งค่าไปหา ตัวแปร msg เพื่อใส่ค่า “ding” ใน msg โดย msg จะมีค่าเป็น “ding” ก็ต่อเมื่อ Channel ที่ชื่อ message ได้รับค่า “ding” มาแล้วเท่านั้น

package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "ding"
}()
msg := <-messages
fmt.Println(msg)
}

ซึ่ง จากที่ได้อธิบายไปตามรูปภาพ ตัว Code ก็จะออกมาเป็นในลักษณะนี้ ผลลัพท์ก็จะ print คำว่า ding ออกมา

เอาไปทำอะไร

ประโยชน์ของเจ้าตัว channel เนี่ย มีหลากหลายมากมายขึ้นอยู่กับการใช้ประโยชน์ แต่จุดที่เหมือนกันในทุกๆประโยชน์เนี่ย คือมันใช้งานร่วมกับ go routine อย่างที่ได้ยกตัวอย่างไป เราสามารถทำ worker pool ด้วย go routine + channel หรือก็คือ Channel Synchronization

ตัวอย่างเช่น เราต้องการใช้ go routine เรียก ให้โปรแกรมทำงานสักอย่างหนึ่งและเมื่อทำงานสำเร็จแล้วจึงค่อยส่งสัญญาณออกมาว่าเสร็จแล้ว ในระหว่างที่รอสัญญาณว่าเสร็จแล้วหรือยังก็ให้โปรแกรมไปทำอย่างอื่น ดังเช่นใน Code ด้านล่าง

package main
import "fmt"
func main() {
done := make(chan bool, 1)
go worker(done)
<-done
}
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
done <- true
}

ก็มีประมานเท่านี้โดยที่นำเอามาอธิบายนั้นไม่ได้เป็นทั้งหมดที่ Channel เพียงแต่ต้องการให้เข้าใจ Concept การทำงานคร่าวๆ ของมันเวลาอ่าน Code คนอื่นแล้วจะได้ไม่งง ว่า เห้ยยยย คนนี้ คนนั้น เขาเขียนอะไรลงไปกันฟระ

อย่าลืมศึกษาหาความรู้เพิ่มเติมกันนั้นครับทุกคน

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”