Google Go で ping pong

GoogleGoErlang の 3.2 Message Passing にある ping pong を作ってみた。

package main

import "fmt";

func main() {
    pongCh := make(chan string);
    pingCh := ping(3, pongCh);
    quit := pong(pongCh, pingCh);
    <-quit;
}

func ping(count int, pongCh chan string) chan string {
  pingCh := make(chan string);
  go func() {
    for {
      switch {
        case count > 0:
          pongCh <- "ping!";
          <-pingCh;
          fmt.Println("Ping received pong.");
        case count == 0:
          fmt.Println("Ping finished");
          pongCh <- "finished";
          return;
      }
      count = count - 1;
    }
  }();
  return pingCh;
}

func pong(pongCh chan string, pingCh chan string) chan bool {
  quit := make(chan bool);
  go func() {
    for {
      switch pingRet := <-pongCh; {
        case pingRet == "finished":
          fmt.Println("Pong finished.");
          quit <- false;
          break;
        default:
          fmt.Println("Pong reveived ping.");
          pingCh <- "pong!";
      }
    }
  }();
  return quit;
}