Back to Blog
Go Language

Pengenalan Channel di Golang

28 April 20253 min read
Pengenalan Channel di Golang

Halo teman-teman! Kembali lagi di seri tutorial Golang Goroutine.

Setelah sebelumnya kita belajar membuat Goroutine, sekarang kita akan membahas Channel, fitur penting di Go yang membuat komunikasi antar Goroutine jadi aman dan efisien.

Di artikel ini kita akan belajar:

* Apa itu Channel

* Kenapa kita butuh Channel

* Cara membuat dan menggunakan Channel

* Menutup Channel dengan close

* Contoh penggunaan dengan unit test


Apa Itu Channel?

Channel adalah sarana di Go untuk mengirim dan menerima data antar Goroutine.

Kalau goroutine itu seperti orang yang bekerja paralel, maka channel itu seperti jalan tempat mereka mengirimkan barang (data) satu sama lain.

> Dengan Channel, kita bisa membuat Goroutine berbicara satu sama lain tanpa perlu menggunakan teknik sinkronisasi manual yang rumit.


Mengapa Menggunakan Channel?

* ✅ Komunikasi antar Goroutine

* ✅ Sinkronisasi otomatis — menunggu saat data dikirim/diterima

* ✅ Aman dan mudah dibanding menggunakan shared memory biasa


Cara Membuat dan Menggunakan Channel

Membuat Channel

Untuk membuat channel di Go:

go
ch := make(chan int)

Channel ini bisa mengirim dan menerima data bertipe int.


Mengirim Data ke Channel

go
ch <- 10

Artinya: kirim angka 10 ke channel.


Menerima Data dari Channel

go
value := <-ch
fmt.Println(value) // output: 10

Artinya: menerima data dari channel dan menyimpannya ke variabel value.


📦 Contoh Praktis: Channel Dasar dengan defer close()

Mari kita lihat contoh nyata menggunakan unit test dan menutup channel:

go
package goroutine_test

import (
	"fmt"
	"testing"
	"time"
)

func TestCreateChannel(t *testing.T) {
	ch := make(chan string)
	defer close(ch) // pastikan channel ditutup setelah fungsi selesai

	// Goroutine untuk mengirim data
	go func() {
		time.Sleep(2 * time.Second) // simulasi proses yang memakan waktu
		ch <- "Hello from channel"
		fmt.Println("Data sent to channel")
	}()

	// Menerima data dari channel
	data := <-ch
	fmt.Println("Received:", data)
}

🧠 Penjelasan:

* make(chan string) membuat channel bertipe string.

* defer close(ch) memastikan bahwa channel akan ditutup setelah TestCreateChannel selesai.

Ini penting untuk mencegah kebocoran sumber daya (*resource leak*) terutama jika channel digunakan dalam aplikasi lebih kompleks.

* Sebuah goroutine mengirim string "Hello from channel" ke dalam channel setelah delay 2 detik.

* Program utama (TestCreateChannel) akan menunggu sampai ada data masuk ke channel (<-ch).

> Karena receive (<-ch) akan otomatis menunggu data dikirim, program kita tetap sinkron dengan goroutine tanpa perlu tambahan kunci (*lock*) manual.


⚠️ Catatan Penting tentang Menutup Channel

* Kita harus menutup channel hanya dari sisi pengirim.

Penerima tidak boleh menutup channel.

* Setelah channel ditutup:

* Penerima masih bisa membaca data yang tersisa.

* Jika channel kosong dan ditutup, pembacaan akan menghasilkan nilai nol tipe data (zero value).

* Menutup channel lebih relevan jika:

* Ada beberapa receiver yang harus tahu kalau channel sudah tidak akan mengirim data lagi.

* Kamu ingin menghindari deadlock di aplikasi yang lebih besar.


Kesimpulan

Hari ini kita sudah belajar:

* Apa itu Channel dan kenapa penting

* Cara membuat, mengirim, menerima data dari Channel

* Cara menutup Channel dengan defer close()

* Contoh nyata dalam bentuk unit test

Dengan Channel, komunikasi antar Goroutine jadi mudah dan aman.


Sampai ketemu di tutorial berikutnya! 🚀


Article Series

Golang Goroutine

Lanjutkan membaca seri ini untuk melihat perjalanan lengkapnya.

  1. 1
    Membuat Goroutine di Golang
    24 Apr 20252 min read
  2. 2
    Pengenalan Channel di Golang
    28 Apr 20253 min readCurrent article
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8