| 
									
										
										
										
											2009-01-30 14:39:31 -08:00
										 |  |  | // $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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-14 13:09:53 -07:00
										 |  |  | func emptyresults() () {} | 
					
						
							|  |  |  | func noresults() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var nothing func() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-30 14:39:31 -08:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											2009-09-14 13:09:53 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	emptyresults(); | 
					
						
							|  |  |  | 	noresults(); | 
					
						
							|  |  |  | 	nothing = emptyresults; | 
					
						
							|  |  |  | 	nothing(); | 
					
						
							|  |  |  | 	nothing = noresults; | 
					
						
							|  |  |  | 	nothing(); | 
					
						
							| 
									
										
										
										
											2009-01-30 14:39:31 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 |