Source file
test/chan/select.go
1
2
3
4
5
6
7
8
9 package main
10
11 var counter uint
12 var shift uint
13
14 func GetValue() uint {
15 counter++
16 return 1 << shift
17 }
18
19 func Send(a, b chan uint) int {
20 var i int
21
22 LOOP:
23 for {
24 select {
25 case a <- GetValue():
26 i++
27 a = nil
28 case b <- GetValue():
29 i++
30 b = nil
31 default:
32 break LOOP
33 }
34 shift++
35 }
36 return i
37 }
38
39 func main() {
40 a := make(chan uint, 1)
41 b := make(chan uint, 1)
42 if v := Send(a, b); v != 2 {
43 println("Send returned", v, "!= 2")
44 panic("fail")
45 }
46 if av, bv := <-a, <-b; av|bv != 3 {
47 println("bad values", av, bv)
48 panic("fail")
49 }
50 if v := Send(a, nil); v != 1 {
51 println("Send returned", v, "!= 1")
52 panic("fail")
53 }
54 if counter != 10 {
55 println("counter is", counter, "!= 10")
56 panic("fail")
57 }
58 }
59
View as plain text