Mastering Golang
  • Tentang Go
  • Instalasi Go
  • Membuat Project Go
  • Go Run & Go Build
  • Apa itu Package pada Go
  • Imports dan Exports
  • Variabel
  • Tipe Data
  • Konstanta dan Komentar
  • Operator
  • Type Conversion
  • Kondisional - IF
  • Kondisional - Switch Case
  • Looping
  • Array
  • Array - Looping
  • Slices
  • Pointer
  • Map
  • Fungsi
  • Struct
  • Method
  • Interface
  • Interface Kosong
  • Concurrency
  • Concurrency - Goroutines
  • Channel
  • Buffered Channel
  • Channel - Close and Range
  • Channel - Direction
  • Channel - Select
  • Concurrency - WaitGroup
  • Concurrency - Mutex
  • JSON Data
  • SQL
  • URL Parsing
  • GO Vendor
  • Unit Testing
  • Go Basic for Web Development
    • Aplikasi Web pada Go - Hello World
    • Root Routing
    • Query String
    • Web Service API Server
    • HTTP Basic Auth
    • RESTFul API dengan Gin dan Gorm
Powered by GitBook
On this page

Was this helpful?

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)
    }
}
PreviousBuffered ChannelNextChannel - Direction

Last updated 4 years ago

Was this helpful?

Perulangan berhenti saat variabel ok bernilai false
Menampilkan data menggunakan range and close