// run | |
// 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. | |
// Test that unbuffered channels act as pure fifos. | |
package main | |
import "os" | |
const N = 10 | |
func AsynchFifo() { | |
ch := make(chan int, N) | |
for i := 0; i < N; i++ { | |
ch <- i | |
} | |
for i := 0; i < N; i++ { | |
if <-ch != i { | |
print("bad receive\n") | |
os.Exit(1) | |
} | |
} | |
} | |
func Chain(ch <-chan int, val int, in <-chan int, out chan<- int) { | |
<-in | |
if <-ch != val { | |
panic(val) | |
} | |
out <- 1 | |
} | |
// thread together a daisy chain to read the elements in sequence | |
func SynchFifo() { | |
ch := make(chan int) | |
in := make(chan int) | |
start := in | |
for i := 0; i < N; i++ { | |
out := make(chan int) | |
go Chain(ch, i, in, out) | |
in = out | |
} | |
start <- 0 | |
for i := 0; i < N; i++ { | |
ch <- i | |
} | |
<-in | |
} | |
func main() { | |
AsynchFifo() | |
SynchFifo() | |
} | |