Kadang ada kasus dimana kita membuat beberapa channel, dan menjalankan beberapa goroutine untuk tiap channel nya, lalu kita ingin mendapatkan data dari channel tersebut, nah jika kita menggunakan perulangan for range maka akan ribet karena itu hanya bisa digunakan untuk satu channel.
Untuk melakukan hal tersebut kita bisa menggunakan select channel yang ada di golang, dengan menggunakan select channel kita bisa memilih data tercepat dari beberapa channel, jika data datang secara bersamaan maka akan diambil terlebih dahulu secara random salah satunya, lalu saat select selanjutnya barulah akan diambil data dari channel lainnya.
Kode program select multiple channel
Berikut contoh kode program untuk mengambil data dari multiple channel
package belajar_golang_goroutines
import (
"fmt"
"strconv"
"testing"
"time"
)
func GiveMeResponse(channel chan string) {
time.Sleep(2 * time.Second)
channel <- "Rendy Wijaya"
}
func TestSelectChannel(t *testing.T) {
channel1 := make(chan string)
channel2 := make(chan string)
defer close(channel1)
defer close(channel2)
go GiveMeResponse(channel1)
go GiveMeResponse(channel2)
counter := 0
for {
select {
case data := <-channel1:
fmt.Println("Data dari Channel 1", data)
counter++
case data := <-channel2:
fmt.Println("Data dari Channel 2", data)
counter++
}
if counter == 2 {
break
}
}
}

Perhatikan kode program diatas, kita akan menggunakan function yangsudah pernah dibuat sebelumnya yaitu GiveMeResponse
untuk mengirim data ke channel. Dan seperti biasa kita juga membuat unit test yang kita beri nama TestSelectChannel
pada unit test ini kita juga membuat dua channel channel1 & channel2
dan dilanjutkan dengan menjalankan dua goroutine untuk channel tersebut di baris 21 & 22.
Seletah menajalnkan goroutine kita akan membuat perulangan tanpa batas menggunakan for
dan di dalam nya barulah kita menangkap atau mengambil data channel1 & channel2
dengan select, tidak lupa juga kita akan menghentikan perulangan jika semua data telah diambil. Coba jalankan program diatas

Bisa dilihat pada outputnya jika kita berhasil mengambil data dari kedua channel dan menampilkan nya ke layar.
Default select
Apa yang terjadi jika kita melakukan select pada channel yang tidak ada datanya, maka by default akan terjadi deadlock, maka kita akan menunggu sampai datanya ada tetapi jika tidak ada terus maka akan terjadi deadlock. Kadang kita ingin melakukan sesuatu saat datanya belum ada agar tidak terjadi error deadlock, dalam select kita bisa menambahkan default, dimana ini akan di eksekusi jika memang di semua channel yang kita melakukan select.
Kode program default
Untuk mencobanya silakan buat unit test baru seperti sebelumnya dengan kode program seperti berikut
func TestDefaultSelectChannel(t *testing.T) {
channel1 := make(chan string)
channel2 := make(chan string)
defer close(channel1)
defer close(channel2)
go GiveMeResponse(channel1)
go GiveMeResponse(channel2)
counter := 0
for {
select {
case data := <-channel1:
fmt.Println("Data dari Channel 1", data)
counter++
case data := <-channel2:
fmt.Println("Data dari Channel 2", data)
counter++
default:
fmt.Println("Menunggu data")
}
if counter == 2 {
break
}
}
}

Kode program diatas sebenarnya hampir sama dengan sebelumnya, hanya saja kita menambahkan default yang akan di eksekusi saat channel belum ada datanya, coba jalankan kode program diatas kembali dan lihat perbedaan outputnya

Pada output diatas bisa dilihat jika saat menunggu data di channel kita melakukan print "Menunggu data"
, dan bisa dilihat jika default nya dijalankan sangat banyak karena memang golang sangat cepat sekali.
Penutup
Pada artikel kali ini kita telah belajar tentang select channel pada bahasa pemrogaman go. Dan pada artikel selanjutnya saya akan membahas race condition & package sync pada bahasa pemrogaman go.