Channel - Close and Range

Pada sesi ini akan dibahas penggunaan close dan looping pada Channel

Pengirim dapat melakukan close pada channel untuk mengindikasikan bahwa sudah tidak ada lagi data yang dikirimkan melalui channel. Jadi Penerima dapat mengecek apakah suatu channel sudah close atau masih mengirim data dengan cara:

v, ok := <-ch

Kita dapat menambahkan 1 variabel yang menampung nilai untuk mengecek apakah channel yang diterima sudah close atau masih ada data yang dikirim.

ok akan bernilai false jika channel sudah close dan sebaliknya.

Perlu dicatat bahwa hanya sender atau pengirim yang dapat menggunakan close

Lalu closing dibutuhkan hanya jika receiver atau penerima perlu mengetahui apakah proses pengiriman data sudah selesai. Ini dibutuhkan untuk memberhentikan proses looping

package main

import (
	"fmt"
)

func producer(chnl chan int) {
	for i := 0; i < 10; i++ {
		chnl <- i
	}
	close(chnl)
}
func main() {
	ch := make(chan int)
	go producer(ch)
	for {
		v, ok := <-ch
		if ok == false {
			break
		}
		fmt.Println("Received ", v, ok)
	}
}

Kita bisa melihat kode di atas menggunakan for yang bersifat infinite namun dapat berhenti karena adanya proses close dan pengecekan dari variabel ok . Jadi jika sudah tidak ada data yang dikirimkan, maka proses looping berhenti.

Penggunaan Range

Jika kita tidak ingin menggunakan forever looping, maka dapat menggunakan range seperti contoh berikut ini:

package main

import (  
    "fmt"
)

func producer(chnl chan int) {  
    for i := 0; i < 10; i++ {
        chnl <- i
    }
    close(chnl)
}
func main() {  
    ch := make(chan int)
    go producer(ch)
    for v := range ch {
        fmt.Println("Received ",v)
    }
}

Last updated