|  | // Copyright 2009 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import "fmt" | 
|  |  | 
|  | type request struct { | 
|  | a, b    int | 
|  | replyc  chan int | 
|  | } | 
|  |  | 
|  | type binOp func(a, b int) int | 
|  |  | 
|  | func run(op binOp, req *request) { | 
|  | reply := op(req.a, req.b) | 
|  | req.replyc <- reply | 
|  | } | 
|  |  | 
|  | func server(op binOp, service chan *request) { | 
|  | for { | 
|  | req := <-service | 
|  | go run(op, req)  // don't wait for it | 
|  | } | 
|  | } | 
|  |  | 
|  | func startServer(op binOp) chan *request { | 
|  | req := make(chan *request) | 
|  | go server(op, req) | 
|  | return req | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | adder := startServer(func(a, b int) int { return a + b }) | 
|  | const N = 100 | 
|  | var reqs [N]request | 
|  | for i := 0; i < N; i++ { | 
|  | req := &reqs[i] | 
|  | req.a = i | 
|  | req.b = i + N | 
|  | req.replyc = make(chan int) | 
|  | adder <- req | 
|  | } | 
|  | for i := N-1; i >= 0; i-- {   // doesn't matter what order | 
|  | if <-reqs[i].replyc != N + 2*i { | 
|  | fmt.Println("fail at", i) | 
|  | } | 
|  | } | 
|  | fmt.Println("done") | 
|  | } |