|  | // $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 _, 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(); | 
|  | } |