| // $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 newfunc() (func(int) int) { |
| return func(x int) int { return x } |
| } |
| |
| |
| 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}); |
| |
| x, y := newfunc(), newfunc(); |
| if x == y { |
| panicln("newfunc returned same func"); |
| } |
| if x(1) != 1 || y(2) != 2 { |
| panicln("newfunc returned broken funcs"); |
| } |
| } |