| // 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"); |
| } |