Chanel adalah sebuah fasilitas yang tersedia pada GO lang yang berfungsi sebagai penghubung antar goroutine yang dibuat dengan menggunakan keyword make dan chan . Mekanisme pengiriman chanel adalah dengan mengirim dan menerima data melalui chanel tersebut.
Perlu digaris bawahi, Goroutine pengirim dan penerima harus berada pada chanel yang berbeda atau disebut buffered chanel. Pengiriman dan peneriman pada chanel ini bersifat blocking atau Synchronous. Ilustrasinya kurang lebih seperti berikut
Perlu digaris bawahi, Goroutine pengirim dan penerima harus berada pada chanel yang berbeda atau disebut buffered chanel. Pengiriman dan peneriman pada chanel ini bersifat blocking atau Synchronous. Ilustrasinya kurang lebih seperti berikut
Penerapan Chanel
Dalam penerapannya, chanel merupakan sebuah variabel yang dibuat dengan menggunakan keyword make dan chan . Variabel channel disini memiliki peran sebagai pengirim dan penerima data.
Langsung saja, berikut adalah contoh program yang menggunakan chanel. 3 buah goroutine akan dieksekusi dengan proses pengiriman data melalui chanel. Data tersebut akan diterima 3 kali pada goroutine utama ( main ).
[code]
package main
import "fmt"
import "runtime"
func main() {
runtime.GOMAXPROCS(2)
var pesan = make(chan string)
var sayHelloTo = func(who string) {
var data = fmt.Sprintf("hello %s", who)
pesan <- data
}
go sayHelloTo("Chelud Wikanti Via")
go sayHelloTo("Chalid Ade Rahman")
go sayHelloTo("Chindy Via Roshita")
var message1 = <- pesan
fmt.Println(message1)
var message2 = <- pesan
fmt.Println(message2)
var message3 = <- pesan
fmt.Println(message3)
}
Pada listing program diatas, variabel message dideklarasikan bertipe chanel string . Pembuatan chanel yaitu dengan menuliskan keyword make dengan isi keyword chan diikuti dengan tipe data chanel yang diinginkan. Dalam listing program diatas dapat kita lihat pada sintaks berikut
var pesan = make(chan string)
Variabel pesan pada kode diatas akan menampung sebuah inputan string dengan isi "hello" yang disiapkan oleh sebuah closure dengan nama sayHelloTo. Tanda <- yang dituliskan di sebelah kiri nama variabel, menunjukan terjadi proses pengiriman data dari variabel yang berada di kanan menuju variabel yang berada pada sebelah kiri. Perhatikan baris berikut :
var sayHelloTo = func(who string) {
var sayHelloTo = func(who string) {
var data = fmt.Sprintf("hello %s", who)
pesan <- data
}
Pada listing program diatas juga, Fungsi sayHelloTo dieksekusi sebanyak tiga kali sebagai goroutine berbeda. Menjadikan program ini berjalan secara asynnchronous atau tidak beraturan dan tidak saling tunggu. Dapat kita lihat pada baris berikut :
go sayHelloTo("Chelud Wikanti Via")
Pada listing program diatas juga, Fungsi sayHelloTo dieksekusi sebanyak tiga kali sebagai goroutine berbeda. Menjadikan program ini berjalan secara asynnchronous atau tidak beraturan dan tidak saling tunggu. Dapat kita lihat pada baris berikut :
go sayHelloTo("Chelud Wikanti Via")
go sayHelloTo("Chalid Ade Rahman")
go sayHelloTo("Chindy Via Roshita")
Seperti yang kita ketahui, perintah go menandakan perintah tersebut dijalankan sebagai goroutine. Dari ketiga fungsi tersebut, goroutine paling awal akan mengirim data dan diterimadatanya oleh variabel message1 . Tanda <- menunjukan bahwa data dari sebelah kanan dikirim menuju variabel sebelah kiri dan disimpan.
var message1 = <- pesan
fmt.Println(message1)
Penerimaan ini bersifat blocking, sehingga statement var message1 = <- pesan berarti data tidak akan diesekusi sebelum data dikirim lewat chanel. Ketiga goroutine tersebut akan menerima data secara berurutan oleh message1 , message2 , message3 kemudian ditampilkan kurang lebih seperti berikut.
Dari hasil output diatas, dapat Anda lihat bahwa eksekusi program tidak menghasilkan output yang sama. Hal ini dikarenakan, meski penerimaan data pada fungsi sayHelloto berurutan. Proses pengiriman data dari ketiga goroutine tersebut berbeda. Kita tidak tahu mana yang dieksekusi terlebih dahulu. Goroutine yang dieksekusi lebih awal, datanya akan diterima dan dimunculkan lebih awal.
Namun dengan menggunakan chanel, proses blocking tidak perlu lagi menggunkaan fmt.scanf(). seperti yang kita pelajari sebelumnya tentang goroutine. Chanel bersifat blocking sehingga dapat digunakan untuk mengantisipasi jika ada goroutine utama selesai lebih dahulu.
Download Source File
Posting Komentar