Arah Channel dan Pola Pipeline
Channel hanya-baca, hanya-tulis, dan pipeline
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 kechan<-, 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<- Thanya untuk mengirim,<-chan Thanya 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
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
- Menjalankan Goroutine
- Channel Tanpa Buffer
- Channel Berbuffer
- Arah Channel dan Pola Pipeline