// $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 c = make(chan int); func check(a []int) { for i := 0; i < len(a); i++ { n := <-c; if n != a[i] { panicln("want", a[i], "got", n, "at", i); } } } func f() { var i, j int; i = 1; j = 2; f := func() { c <- i; i = 4; g := func() { c <- i; c <- j; }; g(); c <- i; }; j = 5; f(); } // Accumulator generator func accum(n int) (func(int) int) { return func(i int) int { n += i; return n; } } func g(a, b func(int) int) { c <- a(2); c <- b(3); c <- a(4); c <- b(5); } func h() { var x8 byte = 100; var x64 int64 = 200; c <- int(x8); c <- int(x64); f := func(z int) { g := func() { c <- int(x8); c <- int(x64); c <- z; }; g(); c <- int(x8); c <- int(x64); c <- int(z); }; x8 = 101; x64 = 201; f(500); } func main() { go f(); check([]int{1,4,5,4}); a := accum(0); b := accum(1); go g(a, b); check([]int{2,4,6,9}); go h(); check([]int{100,200,101,201,500,101,201,500}); }