| // $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 | |
| // test range over channels | |
| func gen(c chan int, lo, hi int) { | |
| for i := lo; i <= hi; i++ { | |
| c <- i; | |
| } | |
| close(c); | |
| } | |
| func seq(lo, hi int) chan int { | |
| c := make(chan int); | |
| go gen(c, lo, hi); | |
| return c; | |
| } | |
| func testchan() { | |
| s := ""; | |
| for i := range seq('a', 'z') { | |
| s += string(i); | |
| } | |
| if s != "abcdefghijklmnopqrstuvwxyz" { | |
| panicln("Wanted lowercase alphabet; got", s); | |
| } | |
| } | |
| // test that range over array only evaluates | |
| // the expression after "range" once. | |
| var nmake = 0; | |
| func makearray() []int { | |
| nmake++; | |
| return []int{1,2,3,4,5}; | |
| } | |
| func testarray() { | |
| s := 0; | |
| for k, v := range makearray() { | |
| s += v; | |
| } | |
| if nmake != 1 { | |
| panicln("range called makearray", nmake, "times"); | |
| } | |
| if s != 15 { | |
| panicln("wrong sum ranging over makearray"); | |
| } | |
| } | |
| func main() { | |
| testchan(); | |
| testarray(); | |
| } |