Channel adalah sebuah mekanisme komunikasi yang memungkinkan goroutine untuk bertukar data dengan fungsi atau komponen lainnya. sama seperti halnya variabel channel memerlukan data tipe spesifik, bedanya kita perlu menampung data yang dikirim melalui channel untuk menggunakannya dan jika channel sudah tidak digunakan lagi, kita perlu menutup channel tersebut.

Selain itu ketika kita menggunakan channel sebagai parameter pada fungsi, kita bisa menentukan arahnya: apakah channel itu hanya digunakan untuk menulis atau hanya membaca data.

Untuk menulis data ke channel kita menggunakan karakter untuk membentuk tanda panah <-,tanda tersebut merupakan arah ke channel dimana data akan ditulis, seperti contoh pada contoh program dibawah ini, pada fungsi tulisKeChannel() terdapat argumen c<-data.

package main

import (
	"fmt"
	"time"
)

func tulisKeChannel(c chan int, data int) {
	fmt.Println(1,data)
	c <- data
	close(c)
	fmt.Println(2,data)
}

Keyword chan digunakan untuk mendeklarasikan bahwa c pada parameter fungsi adalah sebuah channel dan diikuti dengan tipe data channel int. Pada statement c <- data memungkinkan nilai data untuk ditulis ke dalam channel c. Setelah channel tidak digunakan kita perlu menutupnya dengan fungsi close().

Selanjutnya pada fungsi utama:

func main() {
	c := make(chan int)
	go tulisKeChannel(c, 10)
	time.Sleep(time.Second)
}

Disini kita mendefinisikan variabel channel menggunakan fungsi make(), keyword chan dan juga tipe data channel. Selanjutnya kita menggunakan fungsi tulisKeChannel() sebagai goroutine, dan fungsi time.Sleep() untuk menunggu goroutine untuk menyelesaikan tugasnya.

Ketika program dijalankan hasil outputnya seperti berikut:

1 10

Dari hasil output tersebut bisa ketahui bahwa fungsi tulisKeChannel() hanya menjalankan satu statement print pertama fmt.Println(1,data) tetapi tidak menjalankan statement print ke dua fmt.Println(2,data).

Hal tersebut dikarenakan statement c <- data memblock semua eksekusi statement lainnya pada fungsi tulisKeChannel(), menunggu sampai datanya dibaca. Di sisi lain statement time.Sleep(time.Second) pada fungsi main() hanya memberi waktu satu detik agar fungsi tulisKeChannel() menyelesaikan tugasnya. Karena waktunya sudah habis maka program ditutup dan fungsi tulisKeChannel() belum sempat menjalankan fungsi print kedua.

Membaca data dari channel

Untuk membaca data dari channel kita bisa mengarahkan panahnya keluar dari channel <- c.

package main

import (
	"fmt"
	"time"
)

func tulisKeChannel(c chan int, data int) {
	fmt.Println(1,data)
	c <- data
	close(c)
	fmt.Println(2,data)
}

func main() {
	c := make(chan int)
	go tulisKeChannel(c, 10)
	time.Sleep(time.Second)
	fmt.Println("Baca: ", <-c)
	time.Sleep(time.Second)

	_, ok := <-c
	if ok {
		fmt.Println("Channel masih terbuka!")
	} else {
		fmt.Println("Channel sudah tutup!")
	}
}

Jika kamu ingin menyimpan data dari channelnya ke dalam variabel, kau juga bisa menuliskannya statemen seperti contoh output:= <- c. Pada kasus program diatas kita menggunakan statement _, ok := <-c untuk mengecek apakah channel masih terbuka.

Hasil Output program tersebut:

1 10
Baca : 10
2 10
Channel sudah tutup!

Walau hasilnya terkadang tidak terurut, tapi kedua fungsi print pada fungsi tulisKeChannel() dijalankan dengan sempurna, karena channel tidak memblok eksekusi statement fungsi print yang kedua.

Channel sebagai parameter fungsi

Walaupun kedua program sebelumnya tidak menggunakan fitur ini, Tapi Go memungkinkan kita untuk menentukan arah channel ketika digunakan sebagai parameter pada sebuah fungsi; entah digunakan untuk membaca atau menulis data. dua jenis channel tersebut disebut uniderectional channels sedangkan yang kita gunakan pada program sebelumnya adalah biderectional.

Contoh dua fungsi berikut:

func fungsi1(c chan int, data int) { 
    fmt.Println(data) 
    c <- data 
} 

func fungsi2(c chan<- int, data int) { 
    fmt.Println(data) 
    c <- data 
} 

Walaupun kedua fungsi memiliki kegunaan yang sama, tapi pendefinisiannya berbeda. Bedanya terletak pada simbol arah panah <- terletak pada sebelah kanan keyword chan pada parameter fungsi2() menandakan bahwa c channel hanya bisa digunakan hanya untuk menulis data ke channel, sedangkan untuk membaca simbol arah panah berada di sebelah kiri keyword chan (contoh c <- chan int).