Go Academy · Pelajaran

Arah Channel dan Pola Pipeline

Channel hanya-baca, hanya-tulis, dan pipeline

Pelajaran 4 dari 412 langkah

Arah Channel dan Pola Pipeline adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Tipe Saluran Searah

Go memungkinkan Anda membatasi saluran menjadi hanya-pengiriman atau hanya-penerimaan dalam tanda tangan tipe. Ini mendokumentasikan maksud dan mencegah penyalahgunaan:

package main

// send-only: can only send, not receive or close (close is allowed by sender)
func sender(out chan<- int) {
    out <- 42
}

// receive-only: can only receive, not send or close
func receiver(in <-chan int) int {
    return <-in
}

// bidirectional: can do both
func relay(in <-chan int, out chan<- int) {
    out <- <-in
}

Mengonversi Arah Saluran

Saluran dua arah dapat dikonversi secara implisit menjadi salah satu tipe searah, tetapi tidak sebaliknya:

package main
import "fmt"

func produce(out chan<- int) { out <- 1; close(out) }
func consume(in <-chan int)  { fmt.Println(<-in) }

func main() {
    ch := make(chan int)   // bidirectional
    go produce(ch)         // auto-converts to chan<- int
    consume(ch)            // auto-converts to <-chan int
    // chan<- int cannot be converted back to <-chan int
}

Alur: Tahap 1 — Pembuat

alur menghubungkan goroutine, dengan setiap tahap membaca dari saluran keluaran tahap sebelumnya. Pembuat adalah tahap pertama:

package main
import "fmt"

func generate(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

func main() {
    ch := generate(2, 3, 4, 5)
    for v := range ch { fmt.Println(v) }
}

Alur: Tahap 2 — Transformasi

Tahap tengah menerima dari satu saluran, mengubah data, lalu mengirimkannya ke saluran lain:

package main
import "fmt"

func generate(nums ...int) <-chan int {
    out := make(chan int)
    go func() { for _, n := range nums { out <- n }; close(out) }()
    return out
}

func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for v := range in { out <- v * v }
        close(out)
    }()
    return out
}

func main() {
    for v := range square(generate(2, 3, 4, 5)) {
        fmt.Println(v)  // 4, 9, 16, 25
    }
}

Alur: Contoh Lengkap Tiga Tahap

Menghubungkan tiga tahap — menghasilkan, mengubah, dan menyaring:

package main
import "fmt"

func gen(nums ...int) <-chan int {
    c := make(chan int)
    go func() { for _, n := range nums { c <- n }; close(c) }()
    return c
}

func double(in <-chan int) <-chan int {
    c := make(chan int)
    go func() { for v := range in { c <- v * 2 }; close(c) }()
    return c
}

func evens(in <-chan int) <-chan int {
    c := make(chan int)
    go func() { for v := range in { if v%2 == 0 { c <- v } }; close(c) }()
    return c
}

func main() {
    for v := range evens(double(gen(1,2,3,4,5))) {
        fmt.Println(v)  // 2, 4, 6, 8, 10
    }
}

Pembatalan Alur dengan Saluran done

Teruskan saluran done agar tahap-tahap alur dapat berhenti lebih awal ketika dibatalkan:

package main
import "fmt"

func gen(done <-chan struct{}, nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range nums {
            select {
            case out <- n:
            case <-done:  // cancel signal
                return
            }
        }
    }()
    return out
}

func main() {
    done := make(chan struct{})
    ch := gen(done, 1, 2, 3, 4, 5)
    fmt.Println(<-ch)  // 1
    close(done)        // cancel remaining work
    fmt.Println("pipeline cancelled")
}

Distribusi Pekerjaan

Distribusi pekerjaan membagi pekerjaan dari satu saluran ke beberapa goroutine untuk pemrosesan paralel:

package main
import ("fmt"; "sync")

func fanOut(in <-chan int, workers int) []<-chan int {
    outs := make([]<-chan int, workers)
    for i := 0; i < workers; i++ {
        out := make(chan int)
        outs[i] = out
        go func() {
            for v := range in { out <- v * v }  // each worker processes
            close(out)
        }()
    }
    return outs
}

func main() {
    fmt.Println("fan-out distributes work to multiple goroutines")
    _ = sync.WaitGroup{}
}

Penggabungan Saluran

Penggabungan menyatukan beberapa kanal menjadi satu:

package main
import ("fmt"; "sync")

func merge(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        c := c
        go func() { defer wg.Done(); for v := range c { out <- v } }()
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

func gen(nums ...int) <-chan int {
    c := make(chan int)
    go func() { for _, n := range nums { c <- n }; close(c) }()
    return c
}

func main() {
    for v := range merge(gen(1,2), gen(3,4), gen(5,6)) {
        fmt.Println(v)
    }
}

Praktik Terbaik Alur Pemrosesan

Prinsip desain alur pemrosesan:

  • Setiap tahap: rutin Go membaca dari <-chan, menulis ke chan<-, lalu menutup keluaran setelah selesai
  • Hanya produsen yang menutup kanal—jangan pernah konsumen
  • Teruskan kanal done (atau konteks) untuk pembatalan
  • Gunakan tipe kanal berarah dalam semua tanda tangan fungsi
  • Kosongkan kanal saat dibatalkan untuk mencegah kebocoran rutin Go

Alur Pemrosesan CSV di Dunia Nyata

Alur pemrosesan sangat cocok untuk memproses data—baca baris, uraikan, saring, lalu transformasikan:

package main
import ("fmt"; "strings")

func splitLines(data string) <-chan string {
    out := make(chan string)
    go func() {
        for _, line := range strings.Split(data, "\n") {
            if line != "" { out <- line }
        }
        close(out)
    }()
    return out
}

func main() {
    csv := "alice,30\nbob,25\ncarol,35"
    for line := range splitLines(csv) {
        parts := strings.Split(line, ",")
        fmt.Printf("name=%s age=%s\n", parts[0], parts[1])
    }
}

Pemeriksaan Singkat

Apa tujuan tipe kanal berarah dalam tanda tangan fungsi?

Ringkasan: Arah Kanal dan Alur Pemrosesan

Ringkasan:

  • chan<- T hanya untuk mengirim, <-chan T hanya untuk menerima—mendokumentasikan maksud dan memberikan keamanan saat kompilasi
  • Alur pemrosesan: rangkaian rutin Go, setiap rutin membaca dari satu kanal dan menulis ke kanal lain
  • Pendistribusian: satu kanal masukan → beberapa rutin Go
  • Penggabungan: beberapa kanal → digabungkan menjadi satu
  • Selalu tutup kanal dari sisi pengirim; gunakan kanal penyelesaian untuk pembatalan
Gratis untuk memulai

Belajar Go dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Arah Channel dan Pola Pipeline” gratis?

Ya — teks lengkap “Arah Channel dan Pola Pipeline” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Arah Channel dan Pola Pipeline”?

Channel hanya-baca, hanya-tulis, dan pipeline Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Arah Channel dan Pola Pipeline” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menjalankan Goroutine
  2. Channel Tanpa Buffer
  3. Channel Berbuffer
  4. Arah Channel dan Pola Pipeline
← Kembali ke Go Academy