方法一:
var wg sync.WaitGroup
func r(start int, ch1, ch2 chan int) {
defer wg.Done()
for i := start; i <= 101; {
num, ok := <-ch1
if !ok {
close(ch2)
break
}
fmt.Println(num)
ch2 <- i
i = i + 3
}
}
func main() {
ch1, ch2, ch3 := make(chan int, 1), make(chan int, 1), make(chan int, 1)
wg.Add(3)
ch1 <- 1
go r(1, ch1, ch2)
go r(2, ch2, ch3)
go r(3, ch3, ch1)
wg.Wait()
}
方法二:
var chanDone chan int
var end int
func write(ch, next chan int) {
for a := range ch {
fmt.Println(a)
if a < end {
next <- a + 1
} else {
chanDone <- 0
}
}
}
func main() {
ch1, ch2, ch3 := make(chan int, 1), make(chan int, 1), make(chan int, 1)
chanDone, end = make(chan int), 100
go write(ch1, ch2)
go write(ch2, ch3)
go write(ch3, ch1)
ch1 <- 1
<-chanDone
}