| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // 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 // reply channel inside the Request
- }
- type binOp func(a, b int) int
- func run(op binOp, req *Request) {
- req.replyc <- op(req.a, req.b)
- }
- func server(op binOp, service chan *Request, quit chan bool) {
- for {
- select {
- case req := <-service:
- go run(op, req)
- case <-quit:
- return
- }
- }
- }
- func startServer(op binOp) (service chan *Request, quit chan bool) {
- service = make(chan *Request)
- quit = make(chan bool)
- go server(op, service, quit)
- return service, quit
- }
- func main() {
- adder, quit := 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
- }
- // checks:
- for i := N - 1; i >= 0; i-- { // doesn't matter what order
- if <-reqs[i].replyc != N+2*i {
- fmt.Println("fail at", i)
- } else {
- fmt.Println("Request ", i, " is ok!")
- }
- }
- quit <- true
- fmt.Println("done")
- }
|