| // $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] { |
| println("want", a[i], "got", n, "at", i) |
| panic("fail") |
| } |
| } |
| } |
| |
| 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 { |
| println("newfunc returned same func") |
| panic("fail") |
| } |
| if x(1) != 1 || y(2) != 2 { |
| println("newfunc returned broken funcs") |
| panic("fail") |
| } |
| |
| ff(1) |
| } |
| |
| func ff(x int) { |
| call(func() { |
| _ = x |
| }) |
| } |
| |
| func call(func()) { |
| } |