管道可以分为两个方向,一个读,一个写。假如一个函数的输入和输出参数都是相同的chan类型,则该函数可以调用自己。当然多个具有相同参数类型的函数也能组成一个调用链,这个很像unix系统的管道,是一个有类型的管道。
func chain(in chan int) chan int {
out := make(chan int)
go func() {
for v := range in {
out <- 1 + v
}
close(out)
}()
return out
}
func main() {
in := make(chan int)
//初始化输入参数
go func() {
for i := 0; i < 10; i++ {
in <- i
}
close(in)
}()
//连续调用3次chan,相当于把in中的每个元素都加3
out := chain(chain(chain(in)))
for v := range out {
fmt.Println(v)
}
}
输出的结果:
3
4
5
6
7
8
9
10
11
12