| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // 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 (r *Request) String() string {
- return fmt.Sprintf("%d+%d=%d", r.a, r.b, <-r.replyc)
- }
- func server(op binOp, service chan *Request, quit chan bool) {
- for {
- select {
- case req := <-service:
- go run(op, req)
- case <-quit:
- return // stop infinite loop
- }
- }
- }
- 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 })
- // make requests:
- req1 := &Request{3, 4, make(chan int)}
- req2 := &Request{150, 250, make(chan int)}
- // send requests on the service channel
- adder <- req1
- adder <- req2
- // ask for the results: ( method String() is called )
- fmt.Println(req1, req2)
- // shutdown server:
- quit <- true
- fmt.Print("done")
- }
- /* output:
- 3+4=7 150+250=400
- done
- */
|