Belajar Golang #25 : Memahami penggunaan Channel

Memahami penggunaan Channel – Halo semuanya, selamat datang kembali di kodingin. Tutorial golang yang ke- 25 kali ini akan membahas mengenai channel dan cara berkomunikasi antar goroutine.

Untuk anda yang belum belum belajar mengenai goroutine di Golang bisa kembali ke postingan sebelumnya yaitu Cara menggunakan Goroutine – Concurrency.

Apa itu Channel ?

Kita mulai belajar dari pengertian channel di Go. Channel adalah penghubung antara goroutine satu dengan goroutine lainnya. Mekanisme channel yaitu serah terima, dimana ada yang mengirim dan ada yang menerima.

Jika di contohnya di dalam kehidupan nyata seperti pipa yang berisi air, dimana terdapat ujung pengirim air dan ujung sebagai penerima air.

Deklarasi Channel

Setiap channel dapat terkait dengan channel lainnya. Dan channel dapat di cetak dengan tipe data terntentu.

Cara mendeklarasikan channel seperti mendeklarasikan tipe data lainnya. Tipe data nya yaitu chan. misalnya : chan b, artinya variable bertipe channel.

Namun untuk membuat channel baru dapat menggunakan sintaks di awal yaitu make. Contohnya

Secara default channel mempunyai nilai nil. Maka dari itu channel harus di keklarasikan seperti di atas yaitu menggunakan awalan make.

Yuk langsung saja kita latihan deklarasi channel dan cara membuatnya.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Deklarasi Channel serderhana di Golang

Perhatikan kode di atas, hasil dari cetakan nilai tipe channel yaitu channel yang bertipe integer.

Ketika di deklarasikan var a chan int, itu nilai nya masih nil. Sedangkan ketika sudah menggunakan make nilai nya bukan nil lagi.

Namun penggunaan di atas kita belum implementasikan dengan goroutine.

Mengirim dan Menerima Channel

Seperti yang saya bahas sebelumnya bahwa channel mempunyai mekanisme kirim dan menerima.

Cara deklarasi memberi dan menerima nilai channel yaitu dengan tanda <-(arrow).

Contohnya :

Contoh di atas artinya memberikan nilai variable channel a yaitu 10. kemudian nilai channel di berikan nilai variable data. Maka dari itu isi dari data yaitu 10.

Langsung saja kita bikin contoh kode golang nya.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Cara membuat dan menggunakan Channel di Golang

Perhatikan kode dan hasil di atas, deklarasi channel berisi tipe int. Setelah itu terdapat goroutine dengan nama fungsi cetak(). Di dalam fungsi terseebut memberikan parameter channel dengan variable chdata. Lalu di fungsi cetak di memberikan nilai terhadap channel yang di terima yaitu memberi nilai 10. Di tandai dengan sintaks ch <- 10.

Lalu di fungsi utama(main) nilai dari channel di berikan kepada variable lain yaitu nilai. Lalu variable nilai yang berisi isi dari channel di cetak.

Secara default, kirim dan terima channel bersifat blocking, artinya menghentikan fungsi lainnya. Artinya sebuah channel dalama goroutine harus selesai mengirim data ke channel tersebut. Dalam contoh di atas yaitu menunggu nilai isi dari channel di berikan nilai 10.

Latihan menggunakan Channel

Mari kita latihan lagi menggunkan tipe data array dan isi dari array kita lakukan sebuah perulangan(for).

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Latihan menggunakan channel dengan perulangan di Golang

Pertatikan contoh program golang di atas, pembuatan goroutine tidak hanya bisa dilakukan di function yang lain, namun juga dapat menggunakan fungsi clousure. Jika di lihat dari penggunaan channel di atas menunjukkan channel dengan variable chdata di berikan nilai berdasarkan data array dari variable data.

Untuk mencetak nilai yang berulang, artinya lebih dari satu dapat melakukan perulangan walaupun isi dari tipe channel bukan array.

Buat Channel lebih dari Satu

Kita dapat membuat channel lebih dari satu bersamaan dengan membuat jumlah goroutine. Sebenarnya bisa saja ketika kita buat channel lebih dari satu dan goroutine nya hanya satu.

Agar memudahkan dalam belajar golang saya akan berikan contoh bagaimana cara membuat channel lebih dari satu di sertai jumlah goroutine yang berjalan.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Membuat Lebih dari Satu Channel di Golang

Perhatikan contoh latihan golang di atas, terdapat 2 goroutine yang berjalan yaitu penjumlahan() dan pengurangan(), dimana setiap goroutine memiliki channel yang berbeda. Maka dari itu kedua channel memiliki nilai yang berbeda yaitu hasil dari penjumlahan dan pengurangan.

Kondisi Deadlock

Seperti namanya deadlock yaitu jalan buntu. Suatu channel bisa terjadi deadlock ketika tidak saling mengirim dan menerima. Sebagai contoh ada yang mengirim channel namun tidak ada yang membaca isi dari nilai channel tersebut.

Artinya akan muncul deadlock ketika salah satu tidak terpenuhi yaitu mengirim dan menerima.

Yuk kita buat contoh deadlock nya.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Memahami Kondisi Deadlock di Golang

Perhatikan contoh kode program golang deadlock di atas, terdapat channel dengan tipe integer. Dimana channel tersebut di buat dan di berikan nilai 1. Maka akan terjadi deadlock karena tidak ada goroutine yang menerima kiriman channel tersebut.

Maka error yang terjadi seperti pada gambar di atas.

Channel Unidirectional

Sebelumnya kita sudah membahas chanel yang mempunyai 2 arah yaitu mengirim dan menerima. Di GO kita dapat membuat satu arah saja, baik mengirim ataupun menerima.

Bisa yang menentukan channel ini mengirim atau menerima terdapat pada parameter suatu fungsi atau pada pembuatan channel dengan tanda arrow(<-) setelah sintaks chan.

Berikut ini penjelasan mengenai tanda arrow untuk channel.

TandaPenjelasan
ch chan [type data], contoh : ch chan intch bisa digunakan untuk mengirim dan menerima data.
ch chan <- [type data], contoh : ch chan<- intch hanya bisa berguna untuk mengirim data.
ch <- chan [type data], contoh : ch <- chan intch hanya bisa digunakan untuk menerima data.

Sekarang kita coba buat channel satu arah.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Channel satu Arah di Golang

Perhatikan kode program go di atas, terdapat deklarasi channel dengan channel yang digunakan untuk mengirim data saja, di tandai dengan kode program chan<- int.

Sekarang kita latihan lagi menggunakan channel searah, namun sedikit berbeda.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Channel dua arah di Golang

Perhatikan kode program go di atas, variable channel di deklarasikan dua arah yaitu mengirim dan menerima. Namun ketika channel di passing ke fungsi cetak() di ubah menjadi channel satu arah yaitu mengirim saja.

Jadi ketika di cetak di fungsi utama yaitu main() tidak akan menghasilkan error dan mencetak nilai yang di berikan kepada channel.

Menutup Channel

Ketika kita bicara channel dua arah yaitu pengirim dan penerima maka sebenarnya ada hak lain yang dapat di lakukan. Pengirim mempunyai kemampuan menutup channel untuk memberi tahu penerima bahwa tidak ada data lagi.

Penerima dapat memberikan tambahan kondisi apakah channel tersebut sudah di tutup ataupun belum.

yuk kita coba latihan.

main.go

Hasilnya :

Belajar Golang #25 : Memahami penggunaan Channel
Menutup Channel di Golang

Perhatikan kode program di atas, terdapat 1 goroutine dengan nama fungsi cetak(), dimana fungsi tersebut melakukan perulangan sebanyak 10 kali dan di dalam perulangan tersebut data channel di berikan data. Setelah data selesai dikirim maka channel ditutup.

Data yang di tampilkan dengan infinity loop(perulangan terus-menerus). Penerima channel akan memeriksa apakah channel sudah di tutup dengan identifikasi data masih ada ataupun tidak.

Sekian tutorial golang tentang penggunaan channel. Semoga bermanfaat.

Leave a Reply