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