// $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"); | |
} | |
} |