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