Channel - Select
Pada sesi ini akan di bahas penggunaan select pada Channel
select
statement digunakan untuk melakukan pemilihan dan memanage multiple channel yang dibuat. select
statement akan melakukan blocking sampai ada salah satu dari case
yang berjalan.
package main
import (
"fmt"
"time"
)
func server1(ch chan string) {
time.Sleep(5 * time.Second)
ch <- "from server1"
}
func server2(ch chan string) {
time.Sleep(3 * time.Second)
ch <- "from server2"
}
func main() {
output1 := make(chan string)
output2 := make(chan string)
go server1(output1)
go server2(output2)
select {
case s1 := <-output1:
fmt.Println(s1)
case s2 := <-output2:
fmt.Println(s2)
}
}
Mari kita asumsikan bahwa kita memiliki aplikasi dan kita perlu mengembalikan output ke pengguna secepat mungkin. Database untuk aplikasi ini direplikasi dan disimpan di server yang berbeda di seluruh dunia. Asumsikan bahwa fungsi server1 dan server2 sebenarnya berkomunikasi dengan 2 server tersebut. Waktu respons setiap server bergantung pada beban masing-masing dan performa jaringan. Kita mengirim permintaan ke kedua server dan kemudian menunggu. Server yang merespons pertama akan dipilih dan respons lainnya diabaikan. Dengan cara ini kita dapat mengirim permintaan yang sama ke beberapa server dan mengembalikan respons tercepat ke pengguna.

Default Case
Statement default
dari select
dapat dimanfaatkan jika belum ada satupun case
yang siap dijalankan. Ini berguna untuk menghindari blocking.
package main
import (
"fmt"
"time"
)
func process(ch chan string) {
time.Sleep(3 * time.Second)
ch <- "process successful"
}
func main() {
ch := make(chan string)
go process(ch)
for {
time.Sleep(1 * time.Second)
select {
case v := <-ch:
fmt.Println("received value: ", v)
return
default:
fmt.Println("no value received")
}
}
}
Kita lihat bahwa pada kode di atas terdapat fungsi process
yang bertigas sebagai pengirim data melalui Channel. Namun proses pengiriman akan delay 3 detik, sehingga kita menambahkan default
pada select
untuk dijalankan terlebih dahulu sambil menunggu proses penerimaan data.

Last updated
Was this helpful?