Go 并发模式 3 Pipeline模式

By kcersing , 17 四月, 2026

Pipeline模式

 

//如要处理一组数字 过滤偶数->求平方->输出

// 1 将数据转换为 Channel
func gen(nums ...int) <-chan int {
	out := make(chan int)
	go func() {
		for _, num := range nums {
			out <- num
		}
		close(out)
	}()
	return out
}

// 2 过滤器 只保留偶数
func filterEven(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
}

// 3 求平方
func sq(in <-chan int) <-chan int {
	out := make(chan int)
	go func() {
		for n := range in {
			out <- n * n
		}
		close(out)
	}()
	return out
}

func main() {
	// 建立流水线:gen -> filter -> sq
	pipeline := sq(filterEven(gen(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)))
	for n := range pipeline {
		println(n)
	}
}

标签