// $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"); | |
} | |
} |