| // $G $D/$F.go && $L $F.$A && ./$A.out |
| |
| // 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 |
| |
| var counter uint |
| var shift uint |
| |
| func GetValue() uint { |
| counter++; |
| return 1 << shift |
| } |
| |
| func Send(a, b chan uint) int { |
| var i int; |
| |
| LOOP: |
| for { |
| select { |
| case a <- GetValue(): |
| i++; |
| a = nil; |
| case b <- GetValue(): |
| i++; |
| b = nil; |
| default: |
| break LOOP; |
| } |
| shift++; |
| } |
| return i; |
| } |
| |
| func main() { |
| a := make(chan uint, 1); |
| b := make(chan uint, 1); |
| if v := Send(a, b); v != 2 { |
| panicln("Send returned", v, "!= 2"); |
| } |
| if av, bv := <- a, <- b; av | bv != 3 { |
| panicln("bad values", av, bv); |
| } |
| if v := Send(a, nil); v != 1 { |
| panicln("Send returned", v, "!= 1"); |
| } |
| if counter != 10 { |
| panicln("counter is", counter, "!= 10"); |
| } |
| } |