mirror of
https://github.com/golang/go
synced 2024-11-22 01:44:40 -07:00
update to new communications syntax
R=gri OCL=15417 CL=15417
This commit is contained in:
parent
27c0eb8431
commit
592d2e3d8d
@ -456,18 +456,17 @@ Here is the first function in "progs/sieve.go":
|
||||
--PROG progs/sieve.go /Send/ /^}/
|
||||
|
||||
The function "Generate" sends the sequence 2, 3, 4, 5, ... to its
|
||||
argument channel, "ch", using the binary send operator "-<".
|
||||
argument channel, "ch", using the binary communications operator "<-".
|
||||
Channels block, so if there's no recipient for the the value on "ch",
|
||||
the send operation will wait until one becomes available.
|
||||
|
||||
The "Filter" function has three arguments: an input channel, an output
|
||||
channel, and a prime number. It copies values from the input to the
|
||||
output, discarding anything divisible by the prime. The unary prefix
|
||||
output, discarding anything divisible by the prime. The unary communications
|
||||
operator "<-" (receive) retrieves the next value on the channel.
|
||||
|
||||
--PROG progs/sieve.go /Copy/ /^}/
|
||||
|
||||
|
||||
The generator and filters execute concurrently. Go has
|
||||
its own model of process/threads/light-weight processes/coroutines,
|
||||
so to avoid notational confusion we'll call concurrently executing
|
||||
@ -567,9 +566,7 @@ Inside "Server", a "select" statement chooses which of the multiple communicatio
|
||||
listed by its cases can proceed. If all are blocked, it waits until one can proceed; if
|
||||
multiple can proceed, it chooses one at random. In this instance, the "select" allows
|
||||
the server to honor requests until it receives a quit message, at which point it
|
||||
returns, terminating its execution. (The language doesn't yet allow the ":="
|
||||
syntax in "select" statements, although it might one day. Also, observe the use
|
||||
of the binary, infix form of the receive operator.)
|
||||
returns, terminating its execution.
|
||||
|
||||
|
||||
All that's left is to strobe the "quit" channel
|
||||
|
@ -13,7 +13,7 @@ type BinOp (a, b int) int;
|
||||
|
||||
func Run(op *BinOp, request *Request) {
|
||||
result := op(request.a, request.b);
|
||||
request.replyc -< result;
|
||||
request.replyc <- result;
|
||||
}
|
||||
|
||||
func Server(op *BinOp, service *chan *Request) {
|
||||
@ -38,7 +38,7 @@ func main() {
|
||||
req.a = i;
|
||||
req.b = i + N;
|
||||
req.replyc = new(chan int);
|
||||
adder -< req;
|
||||
adder <- req;
|
||||
}
|
||||
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
||||
if <-reqs[i].replyc != N + 2*i {
|
||||
|
@ -13,14 +13,13 @@ type BinOp (a, b int) int;
|
||||
|
||||
func Run(op *BinOp, request *Request) {
|
||||
result := op(request.a, request.b);
|
||||
request.replyc -< result;
|
||||
request.replyc <- result;
|
||||
}
|
||||
|
||||
func Server(op *BinOp, service *chan *Request, quit *chan bool) {
|
||||
for {
|
||||
var request *Request;
|
||||
select {
|
||||
case request <- service:
|
||||
case request := <-service:
|
||||
go Run(op, request); // don't wait for it
|
||||
case <-quit:
|
||||
return;
|
||||
@ -44,12 +43,12 @@ func main() {
|
||||
req.a = i;
|
||||
req.b = i + N;
|
||||
req.replyc = new(chan int);
|
||||
adder -< req;
|
||||
adder <- req;
|
||||
}
|
||||
for i := N-1; i >= 0; i-- { // doesn't matter what order
|
||||
if <-reqs[i].replyc != N + 2*i {
|
||||
print("fail at ", i, "\n");
|
||||
}
|
||||
}
|
||||
quit -< true;
|
||||
quit <- true;
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ package main
|
||||
// Send the sequence 2, 3, 4, ... to channel 'ch'.
|
||||
func Generate(ch *chan int) {
|
||||
for i := 2; ; i++ {
|
||||
ch -< i // Send 'i' to channel 'ch'.
|
||||
ch <- i // Send 'i' to channel 'ch'.
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,7 +17,7 @@ func Filter(in *chan int, out *chan int, prime int) {
|
||||
for {
|
||||
i := <-in // Receive value of new variable 'i' from 'in'.
|
||||
if i % prime != 0 {
|
||||
out -< i // Send 'i' to channel 'out'.
|
||||
out <- i // Send 'i' to channel 'out'.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ func Generate() *chan int {
|
||||
ch := new(chan int);
|
||||
go func(ch *chan int){
|
||||
for i := 2; ; i++ {
|
||||
ch -< i
|
||||
ch <- i
|
||||
}
|
||||
}(ch);
|
||||
return ch;
|
||||
@ -21,7 +21,7 @@ func Filter(in *chan int, prime int) *chan int {
|
||||
go func(in *chan int, out *chan int, prime int) {
|
||||
for {
|
||||
if i := <-in; i % prime != 0 {
|
||||
out -< i
|
||||
out <- i
|
||||
}
|
||||
}
|
||||
}(in, out, prime);
|
||||
@ -34,7 +34,7 @@ func Sieve() *chan int {
|
||||
ch := Generate();
|
||||
for {
|
||||
prime := <-ch;
|
||||
out -< prime;
|
||||
out <- prime;
|
||||
ch = Filter(ch, prime);
|
||||
}
|
||||
}(out);
|
||||
|
Loading…
Reference in New Issue
Block a user