Fungsi -> tempat komunikasi data secara synchronous oleh go routine -> saat melakukan pengiriman data, go routine akan terblok sampai ada yang menerima data tersebut (blocking).
Karakteristik -> hanya bisa menerima 1 tipe data, secara default hanya bisa menampung 1 data, jika tidak digunakan harus di close atau bisa menyebabkan memory leak.
Channel In -> Mengirim data
Channel Out -> Menerima data
Sifatnya -> Blocking
Channel harus di close -> jika tidak bisa menyebabkan memory leak
Contoh #1
package main
import "fmt"
func test(value chan int) {
// channel out
result := 100 + <- value
fmt.Printf("%d ", result)
}
func main() {
fmt.Println("Start")
value := make(chan int)
for i := 0; i < 10; i++ {
go test(value)
// channel in
value <- i
}
fmt.Println("\nEnd")
close(value)
}
Start
100 101 102 103 104 105 106 107 108 109
End
Contoh 2
package main
import "fmt"
func test(value chan int) {
result := 100 + <- value
value <- result
}
func main() {
fmt.Println("Start")
value := make(chan int)
for i := 0; i < 10; i++ {
go test(value)
// channel in
value <- i
// channel out
result := <- value
fmt.Printf("%d ", result)
}
fmt.Println("\nEnd")
close(value)
}
Start
100 101 102 103 104 105 106 107 108 109
End
Contoh 3
package main
import "fmt"
func main() {
fmt.Println("Start")
value := make(chan int)
for i := 0; i < 10; i++ {
go func(i int) {
result := 100 + i
// channel in
value <- result
}(i)
// channel out
print := <- value
fmt.Printf("%d ", print)
}
fmt.Println("\nEnd")
close(value)
}
Start
100 101 102 103 104 105 106 107 108 109
End
Channel perlu di close
Channel perlu di close untuk mengindikasikan tidak ada data yang dikirim lagi ke channel