Channel

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

Reference:

Last updated