2,190
社区成员
发帖
与我相关
我的任务
分享
package main
import "fmt"
func printNumber(N int) {
chs := []chan int {
make(chan int), //use to block A go func
make(chan int), //use to block B go func
make(chan int), //use to block C go func
make(chan int), //use to block main
}
go func(ch []chan int, from int, to int, finish int) { //A print data from chs[0] and send next to chs[1] to awake B
for ;; {
select {
case data := <-ch[from]:
fmt.Printf("A:%d ", data); //use A prefix to check which go func prints the data
if data == N {
ch[finish] <- 0; //if come to the end of data, send signal to chs[3] to awake main
} else {
ch[to] <- data + 1;
}
}
}
}(chs, 0, 1, 3);
go func(ch []chan int, from int, to int, finish int) { //B print data from chs[1] and send next to chs[2] to awake C
for ;; {
select {
case data := <-ch[from]:
fmt.Printf("B:%d ", data);
if data == N {
ch[finish] <- 0; //if come to the end of data, send signal to chs[3] to awake main
} else {
ch[to] <- data + 1;
}
}
}
}(chs, 1, 2, 3);
go func(ch []chan int, from int, to int, finish int) { //A print data from chs[2] and send next to chs[0] to awake A
for ;; {
select {
case data := <-ch[from]:
fmt.Printf("C:%d ", data);
if data == N {
ch[finish] <- 0; //if come to the end of data, send signal to chs[3] to awake main
} else {
ch[to] <- data + 1;
}
}
}
}(chs, 2, 0, 3);
chs[0] <- 1; //awake A go fun
<-chs[3]; //block main until all go func finish
for _, ch := range chs { //close all channel
close(ch)
}
fmt.Println()
}
func main () {
var N int;
fmt.Printf("please input a number: ");
fmt.Scanf("%d", &N);
printNumber(N);
}