Nâng CaoGolang iconGolang

Pipeline pattern với channels?

Chain stages qua channels — mỗi stage là goroutine, data chảy qua channels.

go
// Stage 1: generator
func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

// Stage 2: transform
func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

// Stage 3: filter
func evens(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            if n%2 == 0 {
                out <- n
            }
        }
        close(out)
    }()
    return out
}

// Compose pipeline
func main() {
    for result := range evens(square(gen(1, 2, 3, 4, 5))) {
        fmt.Println(result) // 4, 16
    }
}

Fan-out: nhiều goroutines đọc cùng channel.

Fan-in: merge nhiều channels thành 1.

Xem toàn bộ Golang cùng filter theo level & chủ đề con.

Mở danh sách Golang