สวัสดีครับ ในบทความนี้ก็เป็น EP.8 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Channel Select Multiple Communication Operations
สําหรับท่านใดที่ยังไม่ได้อ่าน EP.7 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.7 Go Unit Testing
ในบทความก่อนหน้านี้เราได้เรียนรู้เรื่องการใช้งาน Go Channel กันไปแล้ว จะเห็นว่าถ้าเราต้องการส่งข้อมูลมากกว่า 1 Channel อาจจะทําเกิด blocking การทำงาน เมื่อ Channel ใด Channel หนึ่งไม่มีการรับส่งข้อมูล หรือไม่สามารถส่งข้อมูลได้อีก สิ่งที่จะมาช่วยให้โปรแกรมของเราทํางานต่อไปได้ก็คือ Select statement เรามาดูวิธีการใช้งานตามหัวข้อด้านล่างเลยครับ
เราสามารถใช้ Select statement ในการ Select chennel ที่ส่งข้อมูลผ่าน Channel มาก่อน และจะไม่สนใจ Channel อื่นๆ หมายความว่า ถ้าเรามี Channel ทั้งหมด 3 ตัว ถ้า Channel ตัวใดตัวหนึ่งส่งข้อมูลมาก่อนก็จะรับข้อมูลจากตัวนั้นแล้วทํางานต่อไปตามที่เรากําหนด ส่วน Channel อื่นๆ ที่ยังไม่ส่งข้อมูลมา หรือส่งมาทีหลัง ระบบจะไม่สนใจ มาดูตัวอย่างกันดีกว่าครับ
package main
import (
"fmt"
"time"
)
func main() {
c1 := make(chan string)
c2 := make(chan string)
go func() {
time.Sleep(3 * time.Second)
c1 <- "one"
}()
go func() {
time.Sleep(1 * time.Second)
c2 <- "two"
}()
for i := 0; i < 2; i++ {
select {
case msg1 := <-c1:
fmt.Println("received", msg1)
case msg2 := <-c2:
fmt.Println("received", msg2)
}
}
}
// Result:
// received two
// received one
จาก Code ด้านบนจะเห็นว่าเรามี Channel สองตัวคือ c1 และ c2 ที่จะใช้เป็น Channel ในการส่งข้อมูลกลับจาก 2 function ที่ทํางานแบบ Parallel
ถ้าเราไม่ใช้ Select เพื่อรับข้อมูลจาก Channel ใด Channel หนึ่ง แล้วเราเขียน Code เพื่อรับข้อมูลจาก c1 ก่อน หมายความว่าถ้า c1 ไม่ส่งข้อมูลมา โปรแกรมของเราจะไปต่อไม่ได้เลย
แต่ถ้าเราใช้ Select เข้ามาช่วยตามตัวอย่างด้านบน ในแต่ละครั้งของการ Loop โปรแกรมจะรอรับค่าของทั้ง c1 และ c2 ถ้า Channel ใดส่งข้อมูลมาก่อนก็จะไปทําใน case นั้นทันที และจะทํางานอื่นๆต่อไปได้เลย
ตามผลลัพธ์ที่ได้ จะเห็นว่าใน Loop แรก แสดง “received two” ก่อน เนื่องจากใน Function ส่งค่า “two” ผ่าน c2 กลับมาก่อน (Sleep แค่ 1 วินาที) ส่วนใน Loop ที่สอง จะไปรอรับค่าของ c1 และ c2 อีกครั้ง แต่เนื่องจาก c2 ถูกส่งข้อมูลกลับมาแล้วใน Loop แรก และในเวลาต่อมาก็มีการส่งค่ากลับมาจาก c1 (ครบกําหนด Sleep 3 วินาที) จึงทําให้แสดงผล “received one” ออกมา
ประมาณนี้ครับ สําหรับการเลือกรับข้อมูลจากหลายๆ Channel
ใน EP.9 จะเป็นเรื่องเกี่ยวกับ Go Context ท่านสามารถกดเข้าไปอ่านต่อกันได้ครับ
สําหรับบทความนี้ก็ขอจบไว้เพียงเท่านี้ครับ ขอบคุณครับ
swap คือ file ประเภทหนึ่งที่ทําหน้าที่คลาย ram โดยจะต่างจาก ram ตรงที่ เป็นไฟล์ที่ถูกเขียนบน HDD ซึ่งจะมีความเร็วน้อยกว่า ram ในกรณีที่ ram ไม่พอ เราสามารถสร้าง swap มาใช้เป็น ram สํารองได้
สวัสดีครับ ในบทความนี้เราจะมาทําความรู้จักกับคําว่า Zero-Day กันครับว่าคืออะไร มาเริ่มกันเลยครับ
ในตอนที่ 7 นี้จะเกี่ยวกับเรื่อง Class and Style Bindings ใน vue.js ครับ ในการจัดการ Class และ Style เราสามารถใช้ v-bind ได้ เพื่อให้เราสามารถใส่ Logic หรือ ตัวแปรลงไปได้ ทําให้เราสามารถทํา Class และ Style แบบ Dinamic ได้ง่ายขึ้น