| // $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 |
| |
| func caller(f func(int, int) int, a, b int, c chan int) { |
| c <- f(a,b) |
| } |
| |
| func gocall(f func(int, int) int, a, b int) int { |
| c := make(chan int); |
| go caller(f, a, b, c); |
| return <-c; |
| } |
| |
| func call(f func(int, int) int, a, b int) int { |
| return f(a, b) |
| } |
| |
| func call1(f func(int, int) int, a, b int) int { |
| return call(f, a, b) |
| } |
| |
| var f func(int, int) int |
| |
| func add(x, y int) int { |
| return x + y |
| } |
| |
| func fn() (func(int, int) int) { |
| return f |
| } |
| |
| var fc func(int, int, chan int) |
| |
| func addc(x, y int, c chan int) { |
| c <- x+y |
| } |
| |
| func fnc() (func(int, int, chan int)) { |
| return fc |
| } |
| |
| func three(x int) { |
| if x != 3 { |
| panic("wrong val", x) |
| } |
| } |
| |
| var notmain func() |
| |
| func emptyresults() () {} |
| func noresults() {} |
| |
| var nothing func() |
| |
| func main() { |
| three(call(add, 1, 2)); |
| three(call1(add, 1, 2)); |
| f = add; |
| three(call(f, 1, 2)); |
| three(call1(f, 1, 2)); |
| three(call(fn(), 1, 2)); |
| three(call1(fn(), 1, 2)); |
| three(call(func(a,b int) int {return a+b}, 1, 2)); |
| three(call1(func(a,b int) int {return a+b}, 1, 2)); |
| |
| fc = addc; |
| c := make(chan int); |
| go addc(1, 2, c); |
| three(<-c); |
| go fc(1, 2, c); |
| three(<-c); |
| go fnc()(1, 2, c); |
| three(<-c); |
| go func(a, b int, c chan int){c <- a+b}(1, 2, c); |
| three(<-c); |
| |
| emptyresults(); |
| noresults(); |
| nothing = emptyresults; |
| nothing(); |
| nothing = noresults; |
| nothing(); |
| } |
| |