mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 07:34:06 +08:00
59 lines
1.3 KiB
Go
Executable File
59 lines
1.3 KiB
Go
Executable File
// 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
|
|
*/
|