# Channel - Close and Range

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:

```go
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.&#x20;

`ok` akan bernilai `false` jika channel sudah `close` dan sebaliknya.

{% hint style="info" %}
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
{% endhint %}

```go
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)
	}
}
```

![Perulangan berhenti saat variabel ok bernilai false](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MT1iSgqu1Cp6bBnrYz-%2F-MT1n8Lv7W-_OkNMy4VK%2FScreen%20Shot%202021-02-09%20at%2000.59.29.png?alt=media\&token=332a5ed8-0c76-4564-b69b-bcbacd145ef1)

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:

```go
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)
    }
}
```

![Menampilkan data menggunakan range and close](https://2969676661-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQaVepPFjuLoNjbs6f8%2F-MT1iSgqu1Cp6bBnrYz-%2F-MT1nwovdGiVCCVxinnQ%2FScreen%20Shot%202021-02-09%20at%2001.03.01.png?alt=media\&token=ca1fd767-f0ad-4472-8c42-310c4e61242c)
