☆FizzBuzz↑
package main
import "fmt"
func natsGen() chan int {
ch := make(chan int);
go func() {
for i := 1; ; i++ {
ch <- i
}
}();
return ch;
}
func fizzGen() chan string {
ch := make(chan string);
go func() {
for {
ch <- "";
ch <- "";
ch <- "Fizz";
}
}();
return ch;
}
func buzzGen() chan string {
ch := make(chan string);
go func() {
for {
ch <- "";
ch <- "";
ch <- "";
ch <- "";
ch <- "Buzz";
}
}();
return ch;
}
func fizzBuzz() chan string {
out := make(chan string);
go func() {
nats := natsGen();
fizz := fizzGen();
buzz := buzzGen();
for {
n := <- nats;
f := <- fizz;
b := <- buzz;
if f != "" || b != "" {
out <- f + b;
}
else {
out <- fmt.Sprintf("%d", n);
}
}
}();
return out;
}
func main() {
fizzbuzz := fizzBuzz();
for i := 1 ; i <= 30 ; i++ {
fmt.Println(<-fizzbuzz);
}
}